diff options
Diffstat (limited to 'src/compiler/GF/Command/CommandInfo.hs')
| -rw-r--r-- | src/compiler/GF/Command/CommandInfo.hs | 57 |
1 files changed, 57 insertions, 0 deletions
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 |
