-- | -- Module : Application.CLI -- License : BSD-Style -- Copyright : Copyright © 2014 Nicolas DI PRIMA -- -- Maintainer : Nicolas DI PRIMA -- Stability : experimental -- Portability : unknown -- module Application.CLI ( -- * Default Main defaultMain -- * CLI , CLI(..) , OptHelp(..) -- ** Default CLIs , Help(..) , printHelp -- * Commands , CLIContext , getHeader , getDefault , initialize , initializeWithDefault , with ) where import Application.CLI.Class import Application.CLI.Types import System.Environment import System.Exit -- | Default usage Command Interface data Usage = Usage instance CLI Usage where name _ = "" desc _ = "" options _ = [] action _ ctx opts = do progName <- getProgName usage (printUsage " " progName ctx) opts usage :: String -> [String] -> IO () usage list msgs = do mapM_ (\str -> putStrLn str) msgs putStrLn list exitFailure data Help = Help instance CLI Help where name _ = "help" desc _ = "show help message" options _ = [] action _ ctx _ = do progName <- getProgName putStrLn $ progName ++ ": " ++ getHeader ctx putStrLn $ printHelp " " progName ctx ------------------------------------------------------------------------------- -- Commands -- ------------------------------------------------------------------------------- -- | Add a new Command into a collection of commands with :: CLI cli => cli -- ^ A new Command Interface -> CLIContext -- ^ The original Collection of commands -> CLIContext with c l = insertCommand (cliToCommand c) l -- | Initialize a collection of commands initializeWithDefault :: CLI cliDefault => cliDefault -- ^ The command to execute if no option is given -> String -- ^ CLI Description -> CLIContext initializeWithDefault defaultCli description = insertDefault (cliToCommand defaultCli) cmdMap where cmdMap :: CLIContext cmdMap = createContext (cliToCommand Usage) description -- | Initialize a collection of command initialize :: String -- ^ CLI Description -> CLIContext initialize description = createContext (cliToCommand Usage) description ------------------------------------------------------------------------------- -- Default Main -- ------------------------------------------------------------------------------- defaultMain :: CLIContext -- ^ A collection of commands -> IO () defaultMain cmdMap = do args <- getArgs case args of [] -> tryDefault (x:xs) -> tryCommand x xs where raiseHelper :: String -> IO () raiseHelper what = cmdAction (getHelper cmdMap) cmdMap [what] tryDefault :: IO () tryDefault = do progName <- getProgName case getDefault cmdMap of Nothing -> raiseHelper $ progName ++ " does not provide default command" Just cmd -> cmdAction cmd cmdMap [] tryCommand :: String -> [String] -> IO () tryCommand cmdstr opts = case lookupCommand cmdstr cmdMap of Nothing -> raiseHelper $ cmdstr ++ ": command does not exist" Just cmd -> cmdAction cmd cmdMap opts