1{-# LANGUAGE CPP #-}
2module Examples.Commands where
3
4import Data.List
5import Data.Monoid
6import Options.Applicative
7
8#if __GLASGOW_HASKELL__ <= 702
9(<>) :: Monoid a => a -> a -> a
10(<>) = mappend
11#endif
12
13data Sample
14  = Hello [String]
15  | Goodbye
16  deriving (Eq, Show)
17
18hello :: Parser Sample
19hello = Hello <$> many (argument str (metavar "TARGET..."))
20
21sample :: Parser Sample
22sample = subparser
23       ( command "hello"
24         (info hello
25               (progDesc "Print greeting"))
26      <> command "goodbye"
27         (info (pure Goodbye)
28               (progDesc "Say goodbye"))
29       )
30      <|> subparser
31       ( command "bonjour"
32         (info hello
33               (progDesc "Print greeting"))
34      <> command "au-revoir"
35         (info (pure Goodbye)
36               (progDesc "Say goodbye"))
37      <> commandGroup "French commands:"
38      <> hidden
39       )
40
41run :: Sample -> IO ()
42run (Hello targets) = putStrLn $ "Hello, " ++ intercalate ", " targets ++ "!"
43run Goodbye = putStrLn "Goodbye."
44
45opts :: ParserInfo Sample
46opts = info (sample <**> helper) idm
47
48main :: IO ()
49main = execParser opts >>= run
50