dotfiles/internal/cli/app.go

144 lines
2.6 KiB
Go

package cli
import (
"fmt"
"os"
"runtime"
"github.com/make-go-great/color-go"
"github.com/urfave/cli/v2"
)
const (
appName = "dotfiles"
appUsage = "managing dotfiles"
// flags
verboseFlag = "verbose"
dryRunFlag = "dry-run"
// commands
installCommand = "install"
updateCommand = "update"
cleanCommand = "clean"
compareCommand = "compare"
// flag usages
verboseUsage = "show what is going on"
dryRunUsage = "demo mode without actually changing anything"
// command usages
installUsage = "install user configs from dotfiles"
updateUsage = "update dotfiles from user configs"
cleanUsage = "clean unused dotfiles"
compareUsage = "compare dotfiles with user configs"
currentDir = "."
)
var (
// command aliases
installAliases = []string{"i"}
updateAliases = []string{"u"}
cleanAliases = []string{"c"}
compareAliases = []string{"cmp"}
)
// denyOSes contains OS which is not supported
// go tool dist list
var denyOSes = map[string]struct{}{
"windows": {},
}
type App struct {
cliApp *cli.App
}
func NewApp() *App {
a := &action{}
cliApp := &cli.App{
Name: appName,
Usage: appUsage,
Commands: []*cli.Command{
{
Name: installCommand,
Aliases: installAliases,
Usage: installUsage,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: verboseFlag,
Usage: verboseUsage,
},
&cli.BoolFlag{
Name: dryRunFlag,
Usage: dryRunUsage,
},
},
Action: a.runInstall,
},
{
Name: updateCommand,
Aliases: updateAliases,
Usage: updateUsage,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: verboseFlag,
Usage: verboseUsage,
},
&cli.BoolFlag{
Name: dryRunFlag,
Usage: dryRunUsage,
},
},
Action: a.runUpdate,
},
{
Name: cleanCommand,
Aliases: cleanAliases,
Usage: cleanUsage,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: verboseFlag,
Usage: verboseUsage,
},
&cli.BoolFlag{
Name: dryRunFlag,
Usage: dryRunUsage,
},
},
Action: a.runClean,
},
{
Name: compareCommand,
Aliases: compareAliases,
Usage: compareUsage,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: verboseFlag,
Usage: verboseUsage,
},
},
Action: a.runCompare,
},
},
Action: a.runHelp,
}
return &App{
cliApp: cliApp,
}
}
func (a *App) Run() {
// Prevent running at runtime
if _, ok := denyOSes[runtime.GOOS]; ok {
color.PrintAppError(appName, fmt.Sprintf("OS %s is not supported right now", runtime.GOOS))
return
}
if err := a.cliApp.Run(os.Args); err != nil {
color.PrintAppError(appName, err.Error())
}
}