summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Command/CommandInfo.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/GF/Command/CommandInfo.hs')
-rw-r--r--src/compiler/GF/Command/CommandInfo.hs51
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