gocli - Minimal Packages for Command-Line Interface
This package is required Go 1.16 or later.
Migrated repository to github.com/goark/gocli
Declare gocli module
See go.mod file.
Usage of gocli package
package main
import (
"os"
"github.com/goark/gocli/exitcode"
"github.com/goark/gocli/rwi"
)
func run(ui *rwi.RWI) exitcode.ExitCode {
ui.Outputln("Hello world")
return exitcode.Normal
}
func main() {
run(rwi.New(
rwi.WithReader(os.Stdin),
rwi.WithWriter(os.Stdout),
rwi.WithErrorWriter(os.Stderr),
)).Exit()
}
Handling SIGNAL with Context Package
package main
import (
"context"
"fmt"
"os"
"time"
"github.com/goark/gocli/signal"
)
func ticker(ctx context.Context) error {
t := time.NewTicker(1 * time.Second) // 1 second cycle
defer t.Stop()
for {
select {
case now := <-t.C: // ticker event
fmt.Println(now.Format(time.RFC3339))
case <-ctx.Done(): // cancel event from context
fmt.Println("Stop ticker")
return ctx.Err()
}
}
}
func Run() error {
errCh := make(chan error, 1)
defer close(errCh)
go func() {
child, cancelChild := context.WithTimeout(
signal.Context(context.Background(), os.Interrupt), // cancel event by SIGNAL
10*time.Second, // timeout after 10 seconds
)
defer cancelChild()
errCh <- ticker(child)
}()
err := <-errCh
fmt.Println("Done")
return err
}
func main() {
if err := Run(); err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
}
import (
"fmt"
"github.com/goark/gocli/file"
)
result := file.Glob("**/*.[ch]", file.NewGlobOption())
fmt.Println(result)
// Output:
// [testdata/include/source.h testdata/source.c]
Support $XDG_CONFIG_HOME
environment value (XDG Base Directory)
import (
"fmt"
"github.com/goark/gocli/config"
)
path := config.Path("app", "config.json")
fmt.Println(path)
// Output:
// /home/username/.config/app/config.json
Support $XDG_CACHE_HOME
environment value (XDG Base Directory)
import (
"fmt"
"github.com/goark/gocli/cache"
)
path := cache.Path("app", "access.log")
fmt.Println(path)
// Output:
// /home/username/.cache/app/access.log