Skip to content

Getting Started

Getting started with aperturerobotics/cli is incredibly simple. A functional command-line application can be created with just a single line of code in your main() function.

package main

import (
    "os"

    "github.com/aperturerobotics/cli"
)

func main() {
    (&cli.App{}).Run(os.Args)
}

While this app runs and displays basic help text, it doesn't perform any actions yet. Let's enhance it by adding a name, usage description, and an action to execute:

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/aperturerobotics/cli"
)

func main() {
    app := &cli.App{
        Name:  "boom",
        Usage: "make an explosive entrance",
        Action: func(*cli.Context) error {
            fmt.Println("boom! I say!")
            return nil
        },
    }

    if err := app.Run(os.Args); err != nil {
        log.Fatal(err)
    }
}

Running this improved version provides a more useful application with clear help text and a defined action.

Adding Flags

Let's make our application more interactive by adding a flag. Flags allow users to pass options to the command. We'll add a --name flag to specify who to greet.

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/aperturerobotics/cli"
)

func main() {
    app := &cli.App{
        Name:  "boom",
        Usage: "make an explosive entrance",
        Flags: []cli.Flag{
            &cli.StringFlag{
                Name:  "name",
                Value: "world", // Default value
                Usage: "who to greet",
            },
        },
        Action: func(cCtx *cli.Context) error {
            name := cCtx.String("name")
            fmt.Printf("boom! Hello %s!\n", name)
            return nil
        },
    }

    if err := app.Run(os.Args); err != nil {
        log.Fatal(err)
    }
}

Now you can run go run main.go --name Bob or simply go run main.go to use the default value "world". The help output (go run main.go --help) will also automatically include information about the new flag.

Adding Subcommands

For more complex applications, you might want different actions grouped under subcommands (like git commit or docker ps). Let's add a greet subcommand to our boom app.

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/aperturerobotics/cli"
)

func main() {
    app := &cli.App{
        Name:  "boom",
        Usage: "make an explosive entrance",
        Commands: []*cli.Command{
            {
                Name:  "greet",
                Usage: "say hello",
                Flags: []cli.Flag{
                    &cli.StringFlag{
                        Name:  "name",
                        Value: "world",
                        Usage: "who to greet",
                    },
                },
                Action: func(cCtx *cli.Context) error {
                    name := cCtx.String("name")
                    fmt.Printf("Hello %s!\n", name)
                    return nil
                },
            },
            // Add more subcommands here
        },
    }

    if err := app.Run(os.Args); err != nil {
        log.Fatal(err)
    }
}

Now, the main action is performed by running go run main.go greet --name Dave. Running go run main.go --help will show the available subcommands.

This tutorial covers the basics of creating a CLI application, adding flags, and organizing functionality with subcommands using aperturerobotics/cli. Explore the Examples section for more advanced use cases.