view growsync.go @ 5:af840bc25791

impl edit cmd
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 04 Dec 2020 18:27:09 +0900
parents 359eff175bf1
children
line wrap: on
line source

package growsync

import (
	"context"
	"flag"
	"fmt"
	"io"
	"log"

	"github.com/pkg/errors"
)

const cmdName = "growsync"

var (
	subCommands       = []cmd{&editCmd{}, &pushCmd{}, &rootCmd{}, &versionCmd{}}
	dispatch          = make(map[string]cmd, len(subCommands))
	maxSubcommandName int
)

func init() {
	for _, r := range subCommands {
		n := r.name()
		l := len(n)
		if l > maxSubcommandName {
			maxSubcommandName = l
		}
		dispatch[n] = r
	}
}

// Run the lectable
func Run(ctx context.Context, argv []string, outStream, errStream io.Writer) error {
	log.SetOutput(errStream)
	nameAndVer := fmt.Sprintf("%s (v%s)", cmdName, version)
	fs := flag.NewFlagSet(nameAndVer, flag.ContinueOnError)
	fs.SetOutput(errStream)
	fs.Usage = func() {
		fmt.Fprintf(fs.Output(), "Usage of %s:\n", nameAndVer)
		fs.PrintDefaults()
		fmt.Fprintf(fs.Output(), "\nCommands:\n")
		formatCommands(fs.Output())
	}
	if err := fs.Parse(argv); err != nil {
		return err
	}

	argv = fs.Args()
	if len(argv) < 1 {
		fs.Usage()
		return errors.New("no subcommand specified")
	}
	rnr, ok := dispatch[argv[0]]
	if !ok {
		return errors.Errorf("unknown subcommand: %s", argv[0])
	}

	config, err := parseConfig()
	if err != nil {
		return err
	}
	return rnr.run(context.Background(), argv[1:], config, outStream, errStream)
}

func formatCommands(out io.Writer) {
	format := fmt.Sprintf("    %%-%ds  %%s\n", maxSubcommandName)
	for _, r := range subCommands {
		fmt.Fprintf(out, format, r.name(), r.description())
	}
}