butcher/src/UI/Butcher/Monadic/Command.hs

99 lines
2.6 KiB
Haskell

-- this module only re-exports the appropriate user-facing stuff from some
-- other modules.
-- | Building-blocks of a CmdParser.
--
-- The simplest sensible CmdParser is just
--
-- > addCmdImpl $ putStrLn "hello, world!"
--
-- (assuming out is IO ()).
--
-- The empty CmdParser is also valid:
--
-- > return ()
--
-- But not very interesting - you won't get an @out@ value from this (e.g. an
-- IO-action to execute) when this matches (on the empty input).
--
-- > do
-- > addCmd "sub" $ do
-- > addCmdImpl $ putStrLn "sub successful"
--
-- Here, note that there is no implementation at the top-level. This means that
-- on the empty input the resulting CommandDesc has no out-value, but on "sub"
-- it has. Executed as a program, the user would be shown the usage on empty
-- input, and the putStrLn would happen on "sub".
--
-- More than one subcommand? easy:
--
-- > do
-- > addCmd "foo" $ do {..}
-- > addCmd "bar" $ do {..}
--
-- Basic flag usage:
--
-- > do
-- > shouldVerbose <- addSimpleBoolFlag "v" ["verbose"] mzero
-- > addCmdImpl $ if shouldVerbose
-- > then putStrLn "Hello, World!!!!!"
-- > else putStrLn "hi."
--
-- Basic param usage:
--
-- > addCmd "echo" $ do
-- > addCmdHelpStr "print its parameter to output"
-- > str <- addRestOfInputStringParam "STRING" (paramHelpStr "the string to print")
-- > addCmdImpl $ putStrLn str
-- > addCmd "echoInt" $ do
-- > i <- addReadParam "INT" mempty
-- > addCmdImpl $ print (i::Int) -- need to disambiguate via typesig.
--
-- There are some other flag/param methods in the respective modules.
-- Also note the example at 'reorderStart'.
module UI.Butcher.Monadic.Command
( addCmd
, addCmdHidden
, addNullCmd
, addCmdImpl
, addCmdSynopsis
, addCmdHelp
, addCmdHelpStr
, reorderStart
, reorderStop
, withReorder
, traverseBarbie
, peekCmdDesc
, peekInput
-- * Building CmdParsers - myprog -v --input PATH
, module UI.Butcher.Monadic.Flag
-- * Building CmdParsers - myprog SOME_INT
, module UI.Butcher.Monadic.Param
-- * Low-level part functions
, addCmdPart
, addCmdPartMany
, addCmdPartInp
, addCmdPartManyInp
, addAlternatives
, ManyUpperBound (..)
, varPartDesc
)
where
#include "prelude.inc"
import UI.Butcher.Internal.MonadicTypes
import UI.Butcher.Internal.Monadic
import UI.Butcher.Monadic.Flag
import UI.Butcher.Monadic.Param
-- | Safe wrapper around 'reorderStart'/'reorderStop' for cases where reducing
-- to a single binding is possible/preferable.
withReorder :: CmdParser f out a -> CmdParser f out a
withReorder x = reorderStart *> x <* reorderStop