46 lines
928 B
Markdown
46 lines
928 B
Markdown
## program
|
|
|
|
~~~~.hs
|
|
data Out = Abort | Continue (IO ())
|
|
|
|
main = do
|
|
putStrLn "example interactive commandline program."
|
|
loop
|
|
where
|
|
cmdParser :: CmdParser Identity Out ()
|
|
cmdParser = do
|
|
addCmd "exit" $ addCmdImpl Abort
|
|
addCmd "greeting" $ addCmdImpl $ Continue $ putStrLn "hi!"
|
|
loop = do
|
|
putStr "example> "
|
|
hFlush stdout
|
|
line <- getLine
|
|
case cmdRunParser Nothing (InputString line) cmdParser of
|
|
(_, Left err) -> do
|
|
print err
|
|
loop
|
|
(_, Right desc) -> case _cmd_out desc of
|
|
Nothing -> do
|
|
putStrLn "Usage: "
|
|
print $ ppUsage desc
|
|
loop
|
|
Just Abort -> return ()
|
|
Just (Continue action) -> do
|
|
action
|
|
loop
|
|
~~~~
|
|
|
|
## sample session:
|
|
|
|
~~~~
|
|
bash> ./example<enter>
|
|
example interactive commandline program.
|
|
example> <enter>
|
|
Usage:
|
|
exit | greeting
|
|
example> greeting<enter>
|
|
hi!
|
|
example> exit<enter>
|
|
bash>
|
|
~~~~
|