module System.Console.Docopt.Public
(
parseArgs
, parseArgsOrExit
, ParseError
, Docopt ()
, usage
, exitWithUsage
, exitWithUsageMessage
, Option()
, Arguments()
, isPresent
, notPresent
, getArg
, getArgOrExitWith
, getArgWithDefault
, getAllArgs
, getArgCount
, command
, argument
, shortOption
, longOption
, getAllArgsM
, notPresentM
, isPresentM
, getFirstArg
)
where
import System.Exit
import Data.Map as M hiding (null)
import Data.Maybe (fromMaybe)
import System.Console.Docopt.Types
import System.Console.Docopt.ApplicativeParsec (ParseError)
import System.Console.Docopt.OptParse
parseArgs :: Docopt -> [String] -> Either ParseError Arguments
parseArgs parser = getArguments (optFormat parser)
parseArgsOrExit :: Docopt -> [String] -> IO Arguments
parseArgsOrExit parser argv = either (const $ exitWithUsage parser) return $ parseArgs parser argv
exitWithUsage :: Docopt -> IO a
exitWithUsage doc = do
putStr $ usage doc
exitFailure
exitWithUsageMessage :: Docopt -> String -> IO a
exitWithUsageMessage doc msg = do
putStrLn msg
putStrLn ""
exitWithUsage doc
isPresent :: Arguments -> Option -> Bool
isPresent args opt =
case opt `M.lookup` args of
Nothing -> False
Just val -> case val of
NoValue -> False
NotPresent -> False
_ -> True
notPresent :: Arguments -> Option -> Bool
notPresent = (not .) . isPresent
getArg :: Arguments -> Option -> Maybe String
getArg args opt =
case opt `M.lookup` args of
Nothing -> Nothing
Just val -> case val of
MultiValue (v:_) -> Just v
Value v -> Just v
_ -> Nothing
getArgOrExitWith :: Docopt -> Arguments -> Option -> IO String
getArgOrExitWith doc args opt = exitUnless $ getArg args opt
where exitUnless = maybe (exitWithUsageMessage doc $ "argument expected for: " ++ show opt) return
getArgWithDefault :: Arguments -> String -> Option -> String
getArgWithDefault args def opt = fromMaybe def (args `getArg` opt)
getAllArgs :: Arguments -> Option -> [String]
getAllArgs args opt =
case opt `M.lookup` args of
Nothing -> []
Just val -> case val of
MultiValue vs -> reverse vs
Value v -> [v]
_ -> []
getArgCount :: Arguments -> Option -> Int
getArgCount args opt =
case opt `M.lookup` args of
Nothing -> 0
Just val -> case val of
Counted i -> i
MultiValue vs -> length vs
Value _ -> 1
Present -> 1
_ -> 0
command :: String -> Option
command = Command
argument :: String -> Option
argument = Argument
shortOption :: Char -> Option
shortOption = ShortOption
longOption :: String -> Option
longOption = LongOption
getAllArgsM :: Monad m => Arguments -> Option -> m [String]
getAllArgsM o e = return $ getAllArgs o e
notPresentM :: Monad m => Arguments -> Option -> m Bool
notPresentM args o = return $ not $ isPresent args o
isPresentM :: Monad m => Arguments -> Option -> m Bool
isPresentM args o = return $ isPresent args o
getFirstArg :: Monad m => Arguments -> Option -> m String
getFirstArg args opt =
let failure = fail $ "no argument given: " ++ show opt
in case opt `M.lookup` args of
Nothing -> failure
Just val -> case val of
MultiValue vs -> if null vs then failure else return $ last vs
Value v -> return v
_ -> failure