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