hdevtools-0.1.0.2: src/Main.hs
module Main where
import System.Environment (getProgName)
import System.IO (hPutStrLn, stderr)
import Client (getServerStatus, serverCommand, stopServer)
import CommandArgs
import Daemonize (daemonize)
import Server (startServer, createListenSocket)
import Types (Command(..))
defaultSocketFilename :: FilePath
defaultSocketFilename = ".hdevtools.sock"
getSocketFilename :: Maybe FilePath -> FilePath
getSocketFilename Nothing = defaultSocketFilename
getSocketFilename (Just f) = f
main :: IO ()
main = do
args <- loadHDevTools
let sock = getSocketFilename (socket args)
case args of
Admin {} -> doAdmin sock args
Check {} -> doCheck sock args
Info {} -> doInfo sock args
Type {} -> doType sock args
doAdmin :: FilePath -> HDevTools -> IO ()
doAdmin sock args
| start_server args =
if noDaemon args then startServer sock Nothing
else do
s <- createListenSocket sock
daemonize True $ startServer sock (Just s)
| status args = getServerStatus sock
| stop_server args = stopServer sock
| otherwise = do
progName <- getProgName
hPutStrLn stderr "You must provide a command. See:"
hPutStrLn stderr $ progName ++ " --help"
doFileCommand :: String -> (HDevTools -> Command) -> FilePath -> HDevTools -> IO ()
doFileCommand cmdName cmd sock args
| null (file args) = do
progName <- getProgName
hPutStrLn stderr "You must provide a haskell source file. See:"
hPutStrLn stderr $ progName ++ " " ++ cmdName ++ " --help"
| otherwise = serverCommand sock (cmd args) (ghcOpts args)
doCheck :: FilePath -> HDevTools -> IO ()
doCheck = doFileCommand "check" $
\args -> CmdCheck (file args)
doInfo :: FilePath -> HDevTools -> IO ()
doInfo = doFileCommand "info" $
\args -> CmdInfo (file args) (identifier args)
doType :: FilePath -> HDevTools -> IO ()
doType = doFileCommand "type" $
\args -> CmdType (file args) (line args, col args)