Skip to content

The simplest way to parse cli arguments in golang

License

Notifications You must be signed in to change notification settings

trhura/simplecli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SimpleCLI

The simplest way to handle cli arguments in golang. Inspired by python Fire package.

Basic usage

package main

import (
        "fmt"
        "github.com/trhura/simplecli"
)

type Calc struct{}

// Need to be a public method, so that it is accessible by external package.
func (c Calc) Add(x int, y int) {
        fmt.Println(x + y)
}

func (c Calc) Multiply(x int, y int) {
        fmt.Println(x * y)
}

func main() {
        simplecli.Handle(&Calc{})
}

CLI usage

thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc
Usage: ./calc add (int, int)
              multiply (int, int)
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc divide
Error:  divide is not a valid command.
...
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc add 3
Error: add requires 2 argument(s).
...
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc add 3 as
Error: as is not a valid number.
...
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc add 3 4
7

With options / flags

package main

import (
	"fmt"
	"github.com/trhura/simplecli"
	"strconv"
)

type Calc struct {
	// Need to be a public field, so that it is accessible by external package.
	Base    int  `base (radix) of input numbers`
	Verbose bool `print verbose output`
}

// Need to be a public method, so that it is accessible by external package.
func (c Calc) Add(x int, y int) {
	xb, _ := strconv.ParseInt(strconv.Itoa(x), c.Base, 32)
	yb, _ := strconv.ParseInt(strconv.Itoa(y), c.Base, 32)
	if c.Verbose {
		fmt.Printf("%d + %d = ", xb, yb)
	}
	fmt.Println(xb + yb)
}

func (c Calc) Multiply(x int, y int) {
	xb, _ := strconv.ParseInt(strconv.Itoa(x), c.Base, 32)
	yb, _ := strconv.ParseInt(strconv.Itoa(y), c.Base, 32)
	if c.Verbose {
		fmt.Printf("%d * %d = ", xb, yb)
	}
	fmt.Println(xb * yb)
}

func main() {
	// Needs to pass a pointer to struct, so it can be modified.
	simplecli.Handle(&Calc{Base: 10, Verbose: false})
}

CLI Usage

thurahlaing @ simplecli > go build examples/calc.go && ./calc
Usage: ./calc [options] add (int, int)
                        multiply (int, int)
Options:
    --base          int   base (radix) of input numbers
    --verbose      bool   print verbose output
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc add 01 10
11
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc --verbose add 01 10
1 + 10 = 11
thurahlaing @ simplecli > go build examples/simple/calc.go && ./calc --verbose --base=2 add 01 10
1 + 2 = 3

Nested commands

package main

import (
	"fmt"
	"github.com/trhura/simplecli"
)

// Database ...
type Database struct {
	Path string `database url path`
}

// Create database
func (db Database) Create() {
	fmt.Println("Creating database.")
}

// Drop database
func (db Database) Drop() {
	fmt.Println("Dropping database.")
}

// App ...
type App struct {
	Database *Database	// needs to be a pointer
	Port     int `server port `
}

// Start the app
func (app App) Start() {
	fmt.Printf("Listening app at %d.\n", app.Port)
}

// Reload the app
func (app App) Reload() {
	fmt.Println("Reloading app.")
}

// Kill the app
func (app App) Kill() {
	fmt.Println("Stoping app.")
}

func main() {
	simplecli.Handle(&App{
		Database: &Database{},
		Port:     8080,
	})
}

CLI Usage

thurahlaing @ simplecli > go build examples/nested/app.go && ./app
Usage: ./app [options] kill ()
                       reload ()
                       start ()
                       database ...
Options:
        --port (int)		`server port`
thurahlaing @ simplecli >  go build examples/nested/app.go && ./app database
Usage: database [options] drop ()
                          create ()
Options:
        --path (string)		`database url path`
thurahlaing @ simplecli > go build examples/nested/app.go && ./app --port=80 start
Listening app at 80.
thurahlaing @ simplecli > go build examples/nested/app.go && ./app --port=80 database --path=dburl create
Creating database.

About

The simplest way to parse cli arguments in golang

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages