Understanding Command-line (CLI) syntax for Gophers
Tags: cli, beginners, programming, go
Published: 2023-07-01 20:08:21

The 2022 Go Developer Survey reveals that building CLI applications ranks as the **second most popular application of Go**, with an impressive majority of over **60% of respondents** expressing their preference for writing in Go.

What this data means is, if you want to become a productive Go developer, learning how to build excellent and user friendly CLI tools is necessary. But, before you begin diving into the depths of `os.Args`, the `flags` package, and the `Cobra` framework, it essential that you have a mental model for how command-line applications word and the terminology used to describe them.

In this article, _you'll dig into the world of CLI syntax, unravel its complexities, and empower you to navigate the command line with confidence_.

## Natural language comparison

Natural language comparison is a term used to describe a user's ability to interact with a CLI application by expressing their intentions in familiar, human-like language, which allows for a more intuitive and user-friendly experience.

The Cobra Framework, the most popular CLI framework written in Go, suggests the following pattern in their concept's documentation.

![Natrual language comparison](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e7rwhn5j6yq0laxhhkg6.png)

In this example: `APPNAME` is the executable, `NOUN` is the _argument_, `VERB` is a _command_, and `ADJECTIVE` is an option, also called a flag.

If you used CLIs for any length of time you'll have noticed that not every CLI follows this exact pattern, another common implementation of the natural language comparison is verb noun, which PowerShell, a popular scripting language uses. With that said, noun verb is a much more common pattern among CLIs.

Now that you've begun to build your mental model for building CLIs with natural language. Let's dive deeper into what exactly arguments are.

## Understanding Arguments

Arguments are the nouns or things that commands act upon. 

They are the values that provide data or instruction to a command when it's invoked. Influencing the commands behavior or determining the task to that's performed.

For example, in the command `touch file.txt`, "touch" is the command, and "file.txt" is the argument or noun, indicating the file to be acted upon.

![touch command example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vorumen827tuaxck26xc.png)

> **Note**: "argument" and "parameter" are sometimes used interchangeably, but they have distinct meanings.
>
> Arguments are values passed during command execution, while parameters are variables defined within functions or methods.

## Exploring Commands

Commands are - verbs - the main actions in a CLI application. 

You use them by typing the executable's name followed by arguments or options\flags. Which allows users to perform specific operations.

For example, the following commands each represent different actions that can be executed within the respective CLI applications.

```bash
ls
[Command==Verb]

mkdir
[Command==Verb]

git commit
[Command] [Verb]
```

For simple command-line tools like `ls` and `mkdir` the names of the commands themselves are the verbs. 

But that's not the case for more complex CLIs like `git` and `npm`. With more complex CLIs the verb shifts to the subcommands.

Subcommands create a hierarchical structure within a CLI, grouping related actions together. 

They allow users to navigate and access different sets of functionality based on the context or domain they're working with. 

For example, within `git`, there are subcommands like "git commit," "git pull," or "git branch."

```bash
> git commit
> git pull
> git branch
``` 

Each subcommand focuses on a specific aspect of version control within the overall "git" command.

## Understanding Flags

Flags, also known as options, modify the behavior of a command or subcommand. 

They act as adjectives, enabling users to customize the command's operation by specifying specific settings, enabling, or disabling features, or providing additional information.

Flags are typically represented by prefixed characters (short-flag) or words (long-flag) that indicate their purpose.

```bash
go -v #short-flag
go --version #long-flag
```

In the above command, the `-v` and `--version` flag instruct the `go` command to return version information.

> Note: Short flags are reserved for the most commonly used flags only. Not every option or flag gets a short flag assigned to it.

## Conclusion

In this post, you explored the components of natural language comparison: arguments, commands, and flags. 

Arguments represent the nouns or entities acted upon by commands, while commands themselves are the verbs or actions performed within the CLI. Flags, acting as adjectives, modify the behavior of commands or subcommands, allowing users to customize their operations. 

Understanding these components is crucial for building effective and user-friendly CLI applications. By leveraging natural language comparison, CLI developers can create intuitive and accessible interfaces that streamline command execution and enhance the overall user experience.