module Bricoleur.Opts
( Command (..),
Options (..),
getOpts,
)
where
import Control.Applicative ((<|>))
import qualified Options.Applicative as Opt
import qualified System.Directory as Sys
import qualified System.FilePath as Sys
data Command
= Test
| Splice
deriving (Eq, Show)
data Options = Options
{ optFile :: FilePath,
optVerbose :: Bool,
optCommand :: Command
}
deriving (Eq, Show)
desc :: String
desc = "Bricoleur: a tool for testing and stiching code into documents"
opts :: Opt.ParserInfo Options
opts =
Opt.info
(p Opt.<**> Opt.helper)
( Opt.progDesc desc
<> Opt.fullDesc
<> Opt.header "arglbargl"
)
where
p =
Options <$> (path <|> pure "")
<*> verbose
<*> Opt.subparser (test <> splice)
path =
Opt.strOption
( Opt.short 'f'
<> Opt.long "file"
<> Opt.metavar "PATH"
<> Opt.help "The path to the project file"
)
verbose =
Opt.switch
( Opt.short 'v'
<> Opt.long "verbose"
<> Opt.help "Show debug messages"
)
test =
Opt.command "test" $
Opt.info
(pure Test Opt.<**> Opt.helper)
(Opt.progDesc "test the provided sources")
splice =
Opt.command "splice" $
Opt.info
(pure Splice Opt.<**> Opt.helper)
(Opt.progDesc "splice sources into a final draft")
getOpts :: IO Options
getOpts = do
cwd <- Sys.getCurrentDirectory
options <- Opt.execParser opts
return $
if null (optFile options)
then options {optFile = cwd Sys.</> "bricoleur"}
else options