-- The main module of the application. -- Processes the command line and runs the shell. module Main where import Paths_ftshell (getDataFileName, version) import Data.Maybe (isNothing) import Data.Version (showVersion) import System.Console.GetOpt import System.Environment (getProgName, getArgs) import Settings import Shell (initAndRunShell) -- The main entry point of the application. -- Processes the command line options. -- Shows help or version information, or starts the shell. main :: IO () main = do settings <- initialSettings >>= parseOptions case insteadOfShell settings of Just PrintHelp -> printHelp Just PrintVersion -> printVersion settings Nothing -> initAndRunShell settings ------- Getting the options ---------------------------------------------------- -- Possible command line option flags. data Flag = ShowHelp -- show the help message | ShowVersion -- show the version message | LoadFile String -- load an additional declarations file | DontLoadPrelude -- don't load the prelude file deriving Eq -- The options menu. options :: [OptDescr Flag] options = [ Option ['h'] ["help"] (NoArg ShowHelp) "show this help message and exit" , Option ['l'] ["load"] (ReqArg LoadFile "FILE") "load an additional file of declarations" , Option ['n'] ["no-prelude"] (NoArg DontLoadPrelude) "don't load the basic file of declarations" , Option ['v'] ["version"] (NoArg ShowVersion) "show version information and exit" ] -- Maps the options to the settings. parseOptions :: Settings -> IO Settings parseOptions settings = do args <- getArgs case getOpt Permute options args of (os, _, []) -> return $ foldl apply settings os (_, _, es) -> do putStr (unlines es) return $ settings { insteadOfShell = Just PrintHelp } -- Applies one command line option to some given settings. apply :: Settings -> Flag -> Settings apply sets ShowHelp = sets { insteadOfShell = Just PrintHelp } apply sets ShowVersion = if isNothing (insteadOfShell sets) then sets { insteadOfShell = Just PrintVersion } else sets apply sets (LoadFile s) = sets { inputFiles = inputFiles sets ++ [s] } apply sets DontLoadPrelude = sets { prelude = Nothing } ------- Printing messages ------------------------------------------------------ -- Shows the available command line options. printHelp :: IO () printHelp = do progName <- getProgName putStr $ usageInfo ("Usage: " ++ progName ++ " [OPTION]...") options putStr $ unlines [ "" , "The application loads first the basic declarations file before every" , "file specified by the `--load' option is loaded in the order given at" , "the command line." , "" ] -- Shows the version and additional information. printVersion :: Settings -> IO () printVersion sets = do declFile <- getDataFileName basicDeclarationsFileName putStr $ unlines [ "FTshell, version " ++ showVersion version , "Automatic generation of free theorems" , "" , "Basic declarations file: " ++ declFile , "Parser: " ++ parserName sets , "Shell backend: " ++ backendName sets , "" , "Usage: For basic information, try the `--help' option." ]