Command Line Subcommands in Visual Basic .NET

Here’s the translation of the Go code to Visual Basic .NET, along with explanations in Markdown format suitable for Hugo:

Some command-line tools have many subcommands, each with its own set of flags. For example, git commit and git push are two different subcommands of the git tool. In Visual Basic .NET, we can use the CommandLineParser library to easily define simple subcommands that have their own flags.

Imports CommandLine
Imports CommandLine.Text

Module Program
    ' Define a class for the "foo" subcommand options
    <Verb("foo", HelpText:="Perform the foo operation.")>
    Class FooOptions
        <Option('e', "enable", Required:=False, HelpText:="Enable the operation.")>
        Public Property Enable As Boolean

        <Option('n', "name", Required:=False, HelpText:="Specify a name.")>
        Public Property Name As String
    End Class

    ' Define a class for the "bar" subcommand options
    <Verb("bar", HelpText:="Perform the bar operation.")>
    Class BarOptions
        <Option('l', "level", Required:=False, HelpText:="Specify the level.")>
        Public Property Level As Integer
    End Class

    Sub Main(args As String())
        Dim result = Parser.Default.ParseArguments(Of FooOptions, BarOptions)(args)

        result.WithParsed(Of FooOptions)(
            Sub(opts)
                Console.WriteLine("subcommand 'foo'")
                Console.WriteLine($"  enable: {opts.Enable}")
                Console.WriteLine($"  name: {opts.Name}")
            End Sub)
        .WithParsed(Of BarOptions)(
            Sub(opts)
                Console.WriteLine("subcommand 'bar'")
                Console.WriteLine($"  level: {opts.Level}")
            End Sub)
        .WithNotParsed(
            Sub(errs)
                Dim helpText = HelpText.AutoBuild(result)
                Console.WriteLine(helpText)
            End Sub)
    End Sub
End Module

In this Visual Basic .NET version, we use the CommandLineParser library to handle subcommands and their respective options. Here’s a breakdown of the code:

  1. We define two classes, FooOptions and BarOptions, to represent the options for each subcommand.

  2. We use attributes to define the subcommands and their options:

    • The Verb attribute defines a subcommand.
    • The Option attribute defines a flag for a subcommand.
  3. In the Main method, we use Parser.Default.ParseArguments to parse the command-line arguments.

  4. We then use the WithParsed method to handle successful parsing for each subcommand, and WithNotParsed to handle parsing errors.

To use this program:

$ dotnet run -- foo --enable --name=joe
subcommand 'foo'
  enable: True
  name: joe

$ dotnet run -- bar --level 8
subcommand 'bar'
  level: 8

$ dotnet run -- baz
Usage: ConsoleApp [options] [command]

Options:
  --version       Show version information
  -?, -h, --help  Show help and usage information

Commands:
  foo  Perform the foo operation.
  bar  Perform the bar operation.

This Visual Basic .NET implementation provides a more structured and type-safe approach to handling subcommands compared to the original Go version. It uses a popular library to handle command-line parsing, which is a common practice in .NET development.