Skip to content

Commit fffa846

Browse files
Merge pull request #109 from chrisdone/cd/2025-11-10-subcommand-support
Add subcommand support
2 parents 36b05b2 + f9b7101 commit fffa846

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

examples/41-commands.hell

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
-- --help:
2+
--
3+
-- Usage: <interactive> COMMAND
4+
--
5+
-- Available options:
6+
-- -h,--help Show this help text
7+
--
8+
-- Available commands:
9+
-- add Add the thing
10+
-- remove
11+
-- list
12+
13+
data Command
14+
= Add Text
15+
| Remove Text
16+
| List
17+
18+
parseAdd = Main.Add <$> Options.strArgument (Argument.metavar "FILE" <> Argument.help "File to add")
19+
20+
parseRemove = Main.Remove <$> Options.strArgument (Argument.metavar "FILE" <> Argument.help "File to remove")
21+
22+
parseList = Applicative.pure Main.List
23+
24+
cmdParser =
25+
Options.hsubparser
26+
( Options.command "add" (Options.info Main.parseAdd (Options.progDesc "Add the thing"))
27+
<> Options.command "remove" (Options.info Main.parseRemove Options.fullDesc)
28+
<> Options.command "list" (Options.info Main.parseList Options.fullDesc)
29+
)
30+
31+
main = do
32+
let opts = Options.info (Main.cmdParser <**> Options.helper) Options.fullDesc
33+
cmd <- Options.execParser opts
34+
case cmd of
35+
Add f -> Text.putStrLn $ "Adding " <> f
36+
Remove f -> Text.putStrLn $ "Removing " <> f
37+
List -> Text.putStrLn "Listing files"

src/Hell.hs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,12 +2076,16 @@ polyLits =
20762076
"Options.flag'" Options.flag' :: forall a. a -> Options.Mod Options.FlagFields a -> Parser a
20772077
"Option.long" option_long :: forall a. Text -> Options.Mod Options.OptionFields a
20782078
"Option.help" options_help :: forall a. Text -> Options.Mod Options.OptionFields a
2079+
"Options.hsubparser" Options.hsubparser :: forall a. Options.Mod Options.CommandFields a -> Parser a
2080+
"Options.command" options_command :: forall a. Text -> Options.ParserInfo a -> Options.Mod Options.CommandFields a
20792081
"Flag.help" options_help :: forall a. Text -> Options.Mod Options.FlagFields a
20802082
"Flag.long" flag_long :: forall a. Text -> Options.Mod Options.FlagFields a
20812083
"Option.value" option_value :: forall a. a -> Options.Mod Options.OptionFields a
20822084
"Argument.value" argument_value :: forall a. a -> Options.Mod Options.ArgumentFields a
20832085
"Argument.metavar" argument_metavar :: forall a. Text -> Options.Mod Options.ArgumentFields a
20842086
"Argument.help" options_help :: forall a. Text -> Options.Mod Options.ArgumentFields a
2087+
"Options.progDesc" options_progDesc :: forall a. Text -> Options.InfoMod a
2088+
"Options.header" options_header :: forall a. Text -> Options.InfoMod a
20852089
|]
20862090
in toplevel
20872091
)
@@ -2095,12 +2099,21 @@ argument_metavar = Options.metavar . Text.unpack
20952099
option_value :: forall a. a -> Options.Mod Options.OptionFields a
20962100
option_value = Options.value
20972101

2102+
options_progDesc :: forall a. Text -> Options.InfoMod a
2103+
options_progDesc = Options.progDesc . Text.unpack
2104+
2105+
options_header :: forall a. Text -> Options.InfoMod a
2106+
options_header = Options.header . Text.unpack
2107+
20982108
argument_value :: forall a. a -> Options.Mod Options.ArgumentFields a
20992109
argument_value = Options.value
21002110

21012111
options_help :: forall f a. Text -> Options.Mod f a
21022112
options_help = Options.help . Text.unpack
21032113

2114+
options_command :: forall a. Text -> Options.ParserInfo a -> Options.Mod Options.CommandFields a
2115+
options_command = Options.command . Text.unpack
2116+
21042117
option_long :: forall a. Text -> Options.Mod Options.OptionFields a
21052118
option_long = Options.long . Text.unpack
21062119

0 commit comments

Comments
 (0)