mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-24 03:52:50 -06:00
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
This commit is contained in:
57
src/compiler/GF/Command/CommandInfo.hs
Normal file
57
src/compiler/GF/Command/CommandInfo.hs
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user