git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Adapt PSCI command parser to support non-abbreviated directives
commit7c77c4bb3d91871275f3af3864f57c5daff8b187 authorŁukasz Hanuszczak <lukasz.hanuszczak@gmail.com> dateTue 10 Mar 2015, 21:15 (12 years ago) parent3acb2f5
1 file changed+24−14
psci/Parser.hs+24−14
psci/Parser.hs+24−14
@@ -22,6 +22,7 @@ import Prelude hiding (lex)
2222import Commands
2323
2424import Data.Char (isSpace)
25+import Data.List (isPrefixOf)
2526
2627import Control.Applicative hiding (many)
2728
@@ -36,16 +37,20 @@ import qualified Language.PureScript.Parser.Common as C (mark, same)
3637parseCommand :: String -> Either String Command
3738parseCommand cmdString =
3839 case splitCommand cmdString of
39− Just ('?', _) -> return Help
40− Just ('q', _) -> return Quit
41− Just ('r', _) -> return Reset
42− Just ('i', moduleName) -> Import <$> parseRest P.moduleName moduleName
43− Just ('b', moduleName) -> Browse <$> parseRest P.moduleName moduleName
44− Just ('m', filename) -> return $ LoadFile (trimEnd filename)
45− Just ('s', command) -> return $ Show (trimEnd command)
46− Just ('t', expr) -> TypeOf <$> parseRest P.parseValue expr
47− Just ('k', ty) -> KindOf <$> parseRest P.parseType ty
48− Just _ -> Left $ "Unrecognized command. Type :? for help."
40+ Just (cmd, arg)
41+ | matches "?" -> return Help
42+ | matches "help" -> return Help
43+ | matches "quit" -> return Quit
44+ | matches "reset" -> return Reset
45+ | matches "import" -> Import <$> parseRest P.moduleName arg
46+ | matches "browse" -> Browse <$> parseRest P.moduleName arg
47+ | matches "module" -> return $ LoadFile (trimEnd arg)
48+ | matches "show" -> return $ Show (trimEnd cmd)
49+ | matches "type" -> TypeOf <$> parseRest P.parseValue arg
50+ | matches "kind" -> KindOf <$> parseRest P.parseType arg
51+ | otherwise -> Left $ "Unrecognized command. Type :? for help."
52+ where
53+ matches = isPrefixOf cmd
4954 Nothing -> parseRest (psciLet <|> psciExpression) cmdString
5055 where
5156 parseRest :: P.TokenParser a -> String -> Either String a
@@ -53,14 +58,19 @@ parseCommand cmdString =
5358 ts <- P.lex "" s
5459 P.runTokenParser "" (p <* eof) ts
5560
61+ trimStart :: String -> String
62+ trimStart = dropWhile isSpace
63+
5664 trimEnd :: String -> String
57− trimEnd = reverse . dropWhile isSpace . reverse
65+ trimEnd = reverse . trimStart . reverse
5866
5967 -- |
60− -- Split a command into a command char and the trailing string
68+ -- Tries to split a command into a directive and the argument.
6169 --
62− splitCommand :: String -> Maybe (Char, String)
63− splitCommand (':' : c : s) = Just (c, dropWhile isSpace s)
70+ splitCommand :: String -> Maybe (String, String)
71+ splitCommand (':' : cmd) = Just (directive, trimStart arg)
72+ where
73+ (directive, arg) = break isSpace cmd
6474 splitCommand _ = Nothing
6575
6676 -- |