diff --git a/examples/41-commands.hell b/examples/41-commands.hell new file mode 100644 index 0000000..042a232 --- /dev/null +++ b/examples/41-commands.hell @@ -0,0 +1,37 @@ +-- --help: +-- +-- Usage: COMMAND +-- +-- Available options: +-- -h,--help Show this help text +-- +-- Available commands: +-- add Add the thing +-- remove +-- list + +data Command + = Add Text + | Remove Text + | List + +parseAdd = Main.Add <$> Options.strArgument (Argument.metavar "FILE" <> Argument.help "File to add") + +parseRemove = Main.Remove <$> Options.strArgument (Argument.metavar "FILE" <> Argument.help "File to remove") + +parseList = Applicative.pure Main.List + +cmdParser = + Options.hsubparser + ( Options.command "add" (Options.info Main.parseAdd (Options.progDesc "Add the thing")) + <> Options.command "remove" (Options.info Main.parseRemove Options.fullDesc) + <> Options.command "list" (Options.info Main.parseList Options.fullDesc) + ) + +main = do + let opts = Options.info (Main.cmdParser <**> Options.helper) Options.fullDesc + cmd <- Options.execParser opts + case cmd of + Add f -> Text.putStrLn $ "Adding " <> f + Remove f -> Text.putStrLn $ "Removing " <> f + List -> Text.putStrLn "Listing files" diff --git a/src/Hell.hs b/src/Hell.hs index 301ce60..eee0634 100644 --- a/src/Hell.hs +++ b/src/Hell.hs @@ -2076,12 +2076,16 @@ polyLits = "Options.flag'" Options.flag' :: forall a. a -> Options.Mod Options.FlagFields a -> Parser a "Option.long" option_long :: forall a. Text -> Options.Mod Options.OptionFields a "Option.help" options_help :: forall a. Text -> Options.Mod Options.OptionFields a + "Options.hsubparser" Options.hsubparser :: forall a. Options.Mod Options.CommandFields a -> Parser a + "Options.command" options_command :: forall a. Text -> Options.ParserInfo a -> Options.Mod Options.CommandFields a "Flag.help" options_help :: forall a. Text -> Options.Mod Options.FlagFields a "Flag.long" flag_long :: forall a. Text -> Options.Mod Options.FlagFields a "Option.value" option_value :: forall a. a -> Options.Mod Options.OptionFields a "Argument.value" argument_value :: forall a. a -> Options.Mod Options.ArgumentFields a "Argument.metavar" argument_metavar :: forall a. Text -> Options.Mod Options.ArgumentFields a "Argument.help" options_help :: forall a. Text -> Options.Mod Options.ArgumentFields a + "Options.progDesc" options_progDesc :: forall a. Text -> Options.InfoMod a + "Options.header" options_header :: forall a. Text -> Options.InfoMod a |] in toplevel ) @@ -2095,12 +2099,21 @@ argument_metavar = Options.metavar . Text.unpack option_value :: forall a. a -> Options.Mod Options.OptionFields a option_value = Options.value +options_progDesc :: forall a. Text -> Options.InfoMod a +options_progDesc = Options.progDesc . Text.unpack + +options_header :: forall a. Text -> Options.InfoMod a +options_header = Options.header . Text.unpack + argument_value :: forall a. a -> Options.Mod Options.ArgumentFields a argument_value = Options.value options_help :: forall f a. Text -> Options.Mod f a options_help = Options.help . Text.unpack +options_command :: forall a. Text -> Options.ParserInfo a -> Options.Mod Options.CommandFields a +options_command = Options.command . Text.unpack + option_long :: forall a. Text -> Options.Mod Options.OptionFields a option_long = Options.long . Text.unpack