--- /dev/null
+module DDNS.Zone
+ ( listZones
+ , completeZoneName
+ )
+ where
+
+import Control.Monad
+import Control.Monad.Trans
+import Data.List
+import Database.HaskellDB
+import qualified DDNS.DB.Zones as Zones
+import Network.DNS.Message
+import System.Console.Haskeline
+
+
+listZones :: Database -> IO [DomainName]
+listZones db
+ = do rows <- query db $ do t <- table Zones.zones
+ project (Zones.zone << t!Zones.zone)
+ return $ map (read . (!Zones.zone)) rows
+
+completeZoneName :: MonadIO m => Database -> CompletionFunc m
+completeZoneName db
+ = completeWord Nothing "" $ \ prefix ->
+ do zones <- liftM (map show) $ liftIO $ listZones db
+ return $ produceCands zones prefix
+ where
+ produceCands :: [String] -> String -> [Completion]
+ produceCands zones prefix
+ = let cands = filter (prefix `isPrefixOf`) zones
+ comps = map mkComp cands
+ in
+ comps
+
+ mkComp :: String -> Completion
+ mkComp zn
+ = Completion {
+ replacement = zn
+ , display = zn
+ , isFinished = True
+ }