egison-4.1.0: hs-src/Language/Egison/CmdOptions.hs
{- |
Module : Language.Egison.CmdOptions
Licence : MIT
This module provides command line options of Egison interpreter.
-}
module Language.Egison.CmdOptions
( EgisonOpts (..)
, defaultOption
, cmdParser
) where
import Data.Char (isDigit)
import Data.List (intercalate)
import Options.Applicative
data EgisonOpts = EgisonOpts {
optExecFile :: Maybe (String, [String]),
optShowVersion :: Bool,
optEvalString :: Maybe String,
optExecuteString :: Maybe String,
optFieldInfo :: [(String, String)],
optLoadLibs :: [String],
optLoadFiles :: [String],
optSubstituteString :: Maybe String,
optMapTsvInput :: Maybe String,
optFilterTsvInput :: Maybe String,
optTsvOutput :: Bool,
optNoIO :: Bool,
optShowBanner :: Bool,
optTestOnly :: Bool,
optPrompt :: String,
optMathExpr :: Maybe String,
optSExpr :: Bool,
optMathNormalize :: Bool
}
defaultOption :: EgisonOpts
defaultOption = EgisonOpts Nothing False Nothing Nothing [] [] [] Nothing Nothing Nothing False False True False "> " Nothing False True
cmdParser :: ParserInfo EgisonOpts
cmdParser = info (helper <*> cmdArgParser)
$ fullDesc
<> header "The Egison Programming Language"
cmdArgParser :: Parser EgisonOpts
cmdArgParser = EgisonOpts
<$> optional ((,) <$> strArgument (metavar "FILE") <*> many (strArgument (metavar "ARGS")))
<*> switch
(short 'v'
<> long "version"
<> help "Show version number")
<*> optional (strOption
(short 'e'
<> long "eval"
<> metavar "EXPR"
<> help "Evaluate the argument string"))
<*> optional (strOption
(short 'c'
<> long "command"
<> metavar "EXPR"
<> help "Execute the argument string"))
<*> many (readFieldOption <$> strOption
(short 'F'
<> long "field"
<> metavar "FIELD"
<> help "Field information"))
<*> many (strOption
(short 'L'
<> long "load-library"
<> metavar "FILE"
<> help "Load library"))
<*> many (strOption
(short 'l'
<> long "load-file"
<> metavar "FILE"
<> help "Load file"))
<*> optional (strOption
(short 's'
<> long "substitute"
<> metavar "EXPR"
<> help "Operate input in tsv format as infinite stream"))
<*> optional (strOption
(short 'm'
<> long "map"
<> metavar "EXPR"
<> help "Operate input in tsv format line by line"))
<*> optional (strOption
(short 'f'
<> long "filter"
<> metavar "EXPR"
<> help "Filter input in tsv format line by line"))
<*> switch
(short 'T'
<> long "tsv"
<> help "Output in tsv format")
<*> switch
(long "no-io"
<> help "Prohibit all io primitives")
<*> flag True False
(long "no-banner"
<> help "Do not display banner")
<*> switch
(short 't'
<> long "test"
<> help "Execute only test expressions")
<*> strOption
(short 'p'
<> long "prompt"
<> metavar "STRING"
<> value "> "
<> help "Set prompt string")
<*> optional (strOption
(short 'M'
<> long "math"
<> metavar "(asciimath|latex|mathematica|maxima)"
<> help "Output in AsciiMath, Latex, Mathematica, or Maxima format"))
<*> flag False True
(short 'S'
<> long "sexpr-syntax"
<> help "Use s-expression syntax")
<*> flag True False
(long "no-normalize"
<> help "Turn off normalization of math expressions")
readFieldOption :: String -> (String, String)
readFieldOption str =
let (s, c) = readFieldOption' str in (f s, f c)
where
f x = "[" ++ intercalate ", " x ++ "]"
readFieldOption' str =
let (s, rs) = span isDigit str in
case rs of
',':rs' -> let (e, opts) = span isDigit rs' in
case opts of
['s'] -> ([s, e], [])
['c'] -> ([], [s, e])
['s', 'c'] -> ([s, e], [s, e])
['c', 's'] -> ([s, e], [s, e])
['s'] -> ([s], [])
['c'] -> ([], [s])
['s', 'c'] -> ([s], [s])
['c', 's'] -> ([s], [s])