changeloguru/internal/cli/app.go

131 lines
2.7 KiB
Go

package cli
import (
"os"
"github.com/haunt98/color"
"github.com/urfave/cli/v2"
)
const (
appName = "changeloguru"
appUsage = "generate changelog from conventional commits"
// flags
verboseFlag = "verbose"
fromFlag = "from"
toFlag = "to"
versionFlag = "version"
scopeFlag = "scope"
repositoryFlag = "repository"
outputFlag = "output"
filenameFlag = "filename"
filetypeFlag = "filetype"
dryRunFlag = "dry-run"
// commands
generateCommand = "generate"
// flag usage
verboseUsage = "show what is going on"
fromUsage = "generate from `COMMIT`"
toUsage = "generate to `COMMIT`"
versionUsage = "`VERSION` to generate, follow Semantic Versioning"
scopeUsage = "scope to generate"
repositoryUsage = "`REPOSITORY` directory path"
outputUsage = "`OUTPUT` directory path"
filenameUsage = "output `FILENAME`"
filetypeUsage = "output `FILETYPE`"
dryRunUsage = "demo run without actually changing anything"
// command usage
generateUsage = "generate changelog"
)
var (
// flag aliases
verboseAliases = []string{"v"}
// command aliases
generateAliases = []string{"gen"}
)
type App struct {
cliApp *cli.App
}
func NewApp() *App {
a := &action{}
cliApp := &cli.App{
Name: appName,
Usage: appUsage,
Commands: []*cli.Command{
{
Name: generateCommand,
Aliases: generateAliases,
Usage: generateUsage,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: verboseFlag,
Aliases: verboseAliases,
Usage: verboseUsage,
},
&cli.StringFlag{
Name: fromFlag,
Usage: fromUsage,
},
&cli.StringFlag{
Name: toFlag,
Usage: toUsage,
},
&cli.StringFlag{
Name: versionFlag,
Usage: versionUsage,
},
&cli.StringSliceFlag{
Name: scopeFlag,
Usage: scopeUsage,
},
&cli.StringFlag{
Name: repositoryFlag,
Usage: repositoryUsage,
DefaultText: defaultRepository,
},
&cli.StringFlag{
Name: outputFlag,
Usage: outputUsage,
DefaultText: defaultOutput,
},
&cli.StringFlag{
Name: filenameFlag,
Usage: filenameUsage,
DefaultText: defaultFilename,
},
&cli.StringFlag{
Name: filetypeFlag,
Usage: filetypeUsage,
DefaultText: defaultFiletype,
},
&cli.BoolFlag{
Name: dryRunFlag,
Usage: dryRunUsage,
},
},
Action: a.RunGenerate,
},
},
Action: a.RunHelp,
}
return &App{
cliApp: cliApp,
}
}
func (a *App) Run() {
if err := a.cliApp.Run(os.Args); err != nil {
color.PrintAppError(appName, err.Error())
}
}