From 4eda3b63c7c0b96d3cb4c73e46c3825d157c07a1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 10 Nov 2025 16:32:03 +0000 Subject: [PATCH 1/2] Add subcommand support --- examples/41-commands.hell | 37 +++++++++++++++++++++++++++++++++++++ src/Hell.hs | 5 +++++ 2 files changed, 42 insertions(+) create mode 100644 examples/41-commands.hell diff --git a/examples/41-commands.hell b/examples/41-commands.hell new file mode 100644 index 0000000..0da675f --- /dev/null +++ b/examples/41-commands.hell @@ -0,0 +1,37 @@ +-- --help: +-- +-- COMMAND +-- +-- Available options: +-- -h,--help Show this help text +-- +-- Available commands: +-- add +-- 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.fullDesc) + <> 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..dfc609b 100644 --- a/src/Hell.hs +++ b/src/Hell.hs @@ -2076,6 +2076,8 @@ 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 @@ -2101,6 +2103,9 @@ 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 From f9b7101cbc6c3bd1709c65a1bcca5e727005ddf0 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 10 Nov 2025 16:37:40 +0000 Subject: [PATCH 2/2] Add some more helpers --- examples/41-commands.hell | 6 +++--- src/Hell.hs | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/41-commands.hell b/examples/41-commands.hell index 0da675f..042a232 100644 --- a/examples/41-commands.hell +++ b/examples/41-commands.hell @@ -1,12 +1,12 @@ -- --help: -- --- COMMAND +-- Usage: COMMAND -- -- Available options: -- -h,--help Show this help text -- -- Available commands: --- add +-- add Add the thing -- remove -- list @@ -23,7 +23,7 @@ parseList = Applicative.pure Main.List cmdParser = Options.hsubparser - ( Options.command "add" (Options.info Main.parseAdd Options.fullDesc) + ( 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) ) diff --git a/src/Hell.hs b/src/Hell.hs index dfc609b..eee0634 100644 --- a/src/Hell.hs +++ b/src/Hell.hs @@ -2084,6 +2084,8 @@ polyLits = "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 ) @@ -2097,6 +2099,12 @@ 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