packages feed

agda-server-0.1: Args.hs

{-# LANGUAGE DeriveDataTypeable, NamedFieldPuns #-}
module Args
    ( getArgs
    , Args (..)
    ) where

import Paths_agda_server

import System.Directory (createDirectoryIfMissing)
import System.Console.CmdArgs.Implicit
import System.FilePath

import Data.Version

------------------

data Args
    = Args
        { sourcedir     :: String
        , includedir    :: [String]
        , datadir       :: String
        , logdir        :: String
        , port          :: Int
        }
        deriving (Show, Data, Typeable)

myargs :: Args
myargs = Args
        { sourcedir     = "."     &= typDir         &= help "Directory of agda files to serve. Default is '.'"
        , includedir    = [""]    &= typDir         &= help "Additional include directory. You can specify more than one. Default is '.'"
        , datadir       = ""      &= typDir         &= help "Directory of template. Default points to the distribution's directory."
        , logdir        = "log"   &= typDir         &= help "Directory to put log files in. Default is 'log'."
        , port          = 8001    &= typ "PORT"     &= help "Port to listen. Default is 8001"
        }  &= summary ("agda-server " ++ showVersion version ++ ", (C) 2012-2013 Péter Diviánszky")
           &= program "agda-server"

completeArgs :: Args -> IO Args
completeArgs args
    | datadir args == "" = do
        dir <- getDataDir
        completeArgs (args {datadir = dir </> "copy"})
completeArgs args = return args


createDirs :: Args -> IO ()
createDirs (Args {sourcedir, logdir}) 
    = mapM_ f [sourcedir, logdir]
 where
    f "" = return ()
    f path = createDirectoryIfMissing True path


getArgs :: IO Args
getArgs = do
    args <- cmdArgs myargs >>= completeArgs
    createDirs args
    return args