# structured-cli
#### Haskell library for building structured CLI applications
This module provides the tools to build a complete "structured" CLI application, similar
to those found in systems like Cisco IOS or console configuration utilities etc. It aims
to be easy for implementors to use.
* How to use this module:
It is often the case that a simple example is the best user guide, at least for the
experienced programmer. The following code illustrates a basic but functioning CLI application:
```haskell
module Main where
import Control.Monad (void)
import Control.Monad.IO.Class (liftIO)
import Data.Default (def)
import System.Console.StructuredCLI
root :: Commands ()
root = do
world >+ do
hello
bye
command "exit" "return to previous level" exit
world :: Commands ()
world = command "world" "enter into the world" $ return NewLevel
hello :: Commands ()
hello = command "hello" "prints a greeting" $ do
liftIO . putStrLn $ "Hello world!"
return NoAction
bye :: Commands ()
bye = command "bye" "say goodbye" $ do
liftIO . putStrLn $ "Sayonara!"
return NoAction
main :: IO ()
main = void $ runCLI "Hello CLI" def root
```
resulting example session:
```
>>> Hello CLI > ?
- world: enter into the world
>>> Hello CLI > world
>>> Hello CLI world > ?
- exit: return to previous level
- bye: say goodbye
- hello: prints a greeting
>>> Hello CLI world > hello
Hello world!
>>> Hello CLI world > bye
Sayonara!
>>> Hello CLI world > exit
>>> Hello CLI >
```
A good way to get you started is to grab the example code available under [example/Main.hs](https://gitlab.com/codemonkeylabs/structured-cli/blob/master/example/Main.hs) and modify it to suit your needs.