diff options
Diffstat (limited to 'src/compiler/GF/Command/CommandInfo.hs')
| -rw-r--r-- | src/compiler/GF/Command/CommandInfo.hs | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/src/compiler/GF/Command/CommandInfo.hs b/src/compiler/GF/Command/CommandInfo.hs index 7d68f9221..b0b5869c3 100644 --- a/src/compiler/GF/Command/CommandInfo.hs +++ b/src/compiler/GF/Command/CommandInfo.hs @@ -1,10 +1,13 @@ module GF.Command.CommandInfo where -import GF.Command.Abstract(Option,Expr) +import GF.Command.Abstract(Option,Expr,Term) +import GF.Text.Pretty(render) +import GF.Grammar.Printer() -- instance Pretty Term +import GF.Grammar.Macros(string2term) import qualified PGF as H(showExpr) import qualified PGF.Internal as H(Literal(LStr),Expr(ELit)) ---- data CommandInfo m = CommandInfo { - exec :: [Option] -> [Expr] -> m CommandOutput, + exec :: [Option] -> CommandArguments -> m CommandOutput, synopsis :: String, syntax :: String, explanation :: String, @@ -35,26 +38,46 @@ class Monad m => TypeCheckArg m where typeCheckArg :: Expr -> m Expr -------------------------------------------------------------------------------- -newtype CommandOutput = Piped {fromPipe :: ([Expr],String)} ---- errors, etc +data CommandArguments = Exprs [Expr] | Strings [String] | Term Term + +newtype CommandOutput = Piped (CommandArguments,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 ([],"") +fromStrings ss = Piped (Strings ss, unlines ss) +fromExprs es = Piped (Exprs es,unlines (map (H.showExpr []) es)) +fromString s = Piped (Strings [s], s) +pipeWithMessage es msg = Piped (Exprs es,msg) +pipeMessage msg = Piped (Exprs [],msg) +pipeExprs es = Piped (Exprs es,[]) -- only used in emptyCommandInfo +void = Piped (Exprs [],"") stringAsExpr = H.ELit . H.LStr -- should be a pattern macro -- ** Converting command input -toStrings = map showAsString +toStrings args = + case args of + Strings ss -> ss + Exprs es -> zipWith showAsString (True:repeat False) es + Term t -> [render t] where - showAsString t = case t of - H.ELit (H.LStr s) -> s - _ -> "\n" ++ H.showExpr [] t ---newline needed in other cases than the first + showAsString first t = + case t of + H.ELit (H.LStr s) -> s + _ -> ['\n'|not first] ++ + H.showExpr [] t ---newline needed in other cases than the first + +toExprs args = + case args of + Exprs es -> es + Strings ss -> map stringAsExpr ss + Term t -> [stringAsExpr (render t)] + +toTerm args = + case args of + Term t -> t + Strings ss -> string2term $ unwords ss -- hmm + Exprs es -> string2term $ unwords $ map (H.showExpr []) es -- hmm -- ** Creating documentation |
