70 lines
2.1 KiB
Haskell
70 lines
2.1 KiB
Haskell
module Main
|
|
( main
|
|
)
|
|
where
|
|
|
|
|
|
import Data.Char
|
|
import Data.Functor.Identity
|
|
|
|
import System.Console.Concurrent
|
|
import System.Console.Regions
|
|
import System.IO
|
|
|
|
import UI.Butcher.Monadic
|
|
|
|
|
|
parser :: CmdParser Identity (IO ()) ()
|
|
parser = do
|
|
addCmd "inner" $ do
|
|
addCmdSynopsis "inner thingy"
|
|
my <- addSimpleBoolFlag "" ["my"] mempty
|
|
addCmdImpl $ do
|
|
putStrLn $ "my = " ++ show my
|
|
putStrLn "inner"
|
|
addCmd "ither" $ do
|
|
addCmdSynopsis "another inner command"
|
|
addCmdImpl $ putStrLn "other"
|
|
reorderStart
|
|
foo <- addSimpleBoolFlag "" ["foo"] (flagHelpStr "!foo help!")
|
|
fooo <- addSimpleBoolFlag "" ["fooo"] (flagHelpStr "!fooo help!")
|
|
bar <- addSimpleBoolFlag "" ["bar"] (flagHelpStr "!bar is useful!")
|
|
x :: Int <- addFlagReadParam "x" [] "X" mempty
|
|
_b <- addSimpleBoolFlag "b" [] mempty
|
|
reorderStop
|
|
addCmdImpl $ do
|
|
putStrLn $ "foo = " ++ show foo
|
|
putStrLn $ "fooo = " ++ show fooo
|
|
putStrLn $ "bar = " ++ show bar
|
|
putStrLn $ "x = " ++ show x
|
|
|
|
main :: IO ()
|
|
main = displayConsoleRegions $ do
|
|
withReg $ \reg1 -> withReg $ \reg2 -> withReg $ \reg3 -> do
|
|
let Right desc = toCmdDesc Nothing parser
|
|
let mainLoop s = do
|
|
let info = runCmdParserFromDesc desc (InputString s) parser
|
|
setConsoleRegion reg1 $ show (_ppi_interactiveHelp info 5)
|
|
setConsoleRegion reg2 (s ++ _ppi_inputSugg info)
|
|
setConsoleRegion reg3 s
|
|
-- putStr s
|
|
c <- getChar
|
|
-- outputConcurrent (show (ord c) ++ "\n")
|
|
-- print $ show $ ord
|
|
case ord c of
|
|
127 -> do
|
|
-- putStr [c]
|
|
mainLoop (if null s then s else init s)
|
|
10 -> do
|
|
-- putStr (replicate 100 $ chr 127)
|
|
mainLoop ""
|
|
27 -> pure ()
|
|
_ -> do
|
|
-- putStr s -- [c]
|
|
mainLoop (s ++ [c])
|
|
hSetEcho stdin False
|
|
hSetBuffering stdin NoBuffering
|
|
hSetBuffering stdout NoBuffering
|
|
mainLoop ""
|
|
where withReg = withConsoleRegion Linear
|