{-# LANGUAGE DataKinds #-} import Control.Monad.Trans import Options.Declarative greet :: Flag "g" '["greet"] "STRING" "greeting message" (Def "Hello" String) -> Flag "" '["decolate"] "" "decolate message" Bool -> Arg "NAME" String -> Cmd "Greeting command" () greet msg deco name = do let f x | get deco = "*** " ++ x ++ " ***" | otherwise = x liftIO $ putStrLn $ f $ get msg ++ ", " ++ get name ++ "!" connect :: Flag "h" '["host"] "HOST" "host name" (Def "localhost" String) -> Flag "p" '["port"] "PORT" "port number" (Def "8080" Int ) -> Cmd "Connect command" () connect host port = do let addr = get host ++ ":" ++ show (get port) liftIO $ putStrLn $ "connect to " ++ addr getOptExample :: Flag "o" '["output"] "FILE" "output FILE" (Def "stdout" String) -> Flag "c" '[] "FILE" "input FILE" (Def "stdin" String) -> Flag "L" '["libdir"] "DIR" "library directory" String -> Cmd "GetOpt example" () getOptExample output input libdir = liftIO $ print (get output, get input, get libdir) main :: IO () main = run_ $ Group "Test program for sub commands" [ subCmd "greet" greet , subCmd "connect" connect , subCmd "getopt" getOptExample ]