From d38efbaa6a2c94218bb65925bd9ad6c028dfbfd6 Mon Sep 17 00:00:00 2001 From: hallgren Date: Mon, 10 Aug 2015 13:01:02 +0000 Subject: Refactor GF shell modules to improve modularity and reusability + Move type CommandInfo from GF.Command.Commands to a new module GF.Commands.CommandInfo and make it independent of the PGF type. + Make the module GF.Command.Interpreter independent of the PGF type and eliminate the import of GF.Command.Commands. + Move the implementation of the "help" command to its own module GF.Command.Help --- src/compiler/GF/Command/CommandInfo.hs | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/compiler/GF/Command/CommandInfo.hs (limited to 'src/compiler/GF/Command/CommandInfo.hs') diff --git a/src/compiler/GF/Command/CommandInfo.hs b/src/compiler/GF/Command/CommandInfo.hs new file mode 100644 index 000000000..bffb452ce --- /dev/null +++ b/src/compiler/GF/Command/CommandInfo.hs @@ -0,0 +1,57 @@ +module GF.Command.CommandInfo where +import GF.Command.Abstract(Option,Expr) +import GF.Infra.SIO(SIO) +import qualified PGF as H(showExpr) +import qualified PGF.Internal as H(Literal(LStr),Expr(ELit)) ---- +import GF.Text.Pretty(Doc) + +data CommandInfo env = CommandInfo { + exec :: env -> [Option] -> [Expr] -> SIO CommandOutput, + synopsis :: String, + syntax :: String, + explanation :: String, + longname :: String, + options :: [(String,String)], + flags :: [(String,String)], + examples :: [(String,String)], + needsTypeCheck :: Bool + } + +emptyCommandInfo :: CommandInfo env +emptyCommandInfo = CommandInfo { + exec = \_ _ ts -> return $ pipeExprs ts, ---- + synopsis = "", + syntax = "", + explanation = "", + longname = "", + options = [], + flags = [], + examples = [], + needsTypeCheck = True + } +-------------------------------------------------------------------------------- + +class TypeCheckArg env where typeCheckArg :: env -> Expr -> Either Doc Expr + +-------------------------------------------------------------------------------- + +newtype CommandOutput = Piped {fromPipe :: ([Expr],String)} ---- errors, etc + +-- ** Converting command output +fromStrings ss = Piped (map stringAsExpr ss, unlines ss) +fromExprs es = Piped (es,unlines (map (H.showExpr []) es)) +fromString s = Piped ([stringAsExpr s], s) +pipeWithMessage es msg = Piped (es,msg) +pipeMessage msg = Piped ([],msg) +pipeExprs es = Piped (es,[]) -- only used in emptyCommandInfo +void = Piped ([],"") + +stringAsExpr = H.ELit . H.LStr -- should be a pattern macro + +-- ** Converting command input +toString = unwords . toStrings +toStrings = map showAsString + where + showAsString t = case t of + H.ELit (H.LStr s) -> s + _ -> "\n" ++ H.showExpr [] t ---newline needed in other cases than the first -- cgit v1.2.3