Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add generators for args #1

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ var (
app = kingpin.New("App", "A demo app")

// 2. Add a top level flag to gen fig spec, it is hidden from the help output
completionSpecFig = app.Flag("completion-spec-fig", "Generate completion script for fig.").Hidden().PreAction(figkingpin.GenerateFigCompletionSpec(app)).Bool()
)
completionSpecFig = app.Flag("completion-spec-fig", "Generate completion script for fig.").Hidden().PreAction(figkingpin.GenerateFigCompletionSpec(app)).String())
```

### 2. Generate a Fig Spec via `--completion-spec-fig`

```bash
go run main.go --completion-spec-fig > fig-spec.ts
go run main.go --completion-spec-fig spec-name > spec-name.ts
```
4 changes: 2 additions & 2 deletions _example/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ var (
app = kingpin.New("Bucket Uploader", "A command-line app to upload files to a cloud storage bucket.")

// 2. Add a top level flag to gen fig spec, it is hidden from the help output
completionSpecFig = app.Flag("completion-spec-fig", "Generate completion script for fig.").Hidden().PreAction(figkingpin.GenerateFigCompletionSpec(app)).Bool()
completionSpecFig = app.Flag("completion-spec-fig", "Generate completion script for fig.").Hidden().PreAction(figkingpin.GenerateFigCompletionSpec(app)).String()

// Other commands
uploadCmd = app.Command("upload", "Upload a file to a specified bucket.")
filePath = uploadCmd.Arg("file", "Path of the file to upload.").Required().String()
bucketName = uploadCmd.Arg("bucket", "Name of the bucket where the file will be uploaded.").Required().String()
bucketName = uploadCmd.Flag("bucket", "Name of the bucket where the file will be uploaded.").Required().Enum("bucket1", "bucket2")

nestedLevel1Cmd = app.Command("nested", "A nested command.")
nestedLevel2Cmd = nestedLevel1Cmd.Command("level2", "A nested command.")
Expand Down
51 changes: 30 additions & 21 deletions figkingpin.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"gopkg.in/alecthomas/kingpin.v2"
)

func figFlagJson(model *kingpin.FlagModel) any {
func figFlagJson(model *kingpin.FlagModel, specName string, fullCmd string) any {
var flag = map[string]interface{}{}

if model.Short != 0 {
Expand All @@ -31,25 +31,27 @@ func figFlagJson(model *kingpin.FlagModel) any {

if !model.IsBoolFlag() {
flag["args"] = map[string]interface{}{
"name": "ARG",
"name": model.FormatPlaceHolder(),
"generator": map[string]interface{}{
"script": fmt.Sprintf("%s --completion-bash %s --%s", specName, fullCmd, model.Name),
"splitOn": "\n",
},
}

flag["requiresEquals"] = true
}

return flag

}

func figFlagsJson(models []*kingpin.FlagModel) []any {
func figFlagsJson(models []*kingpin.FlagModel, specName string, fullCmd string) []any {
var flags []any
for _, model := range models {
flags = append(flags, figFlagJson(model))
flags = append(flags, figFlagJson(model, specName, fullCmd))
}
return flags
}

func figArgJson(model *kingpin.ArgModel) any {
func figArgJson(model *kingpin.ArgModel, specName string, fullCmd string) any {
var arg = map[string]interface{}{
"name": model.Name,
}
Expand All @@ -62,31 +64,36 @@ func figArgJson(model *kingpin.ArgModel) any {
arg["isRequired"] = model.Required
}

arg["generator"] = map[string]interface{}{
"script": fmt.Sprintf("%s --completion-bash %s --%s", specName, fullCmd, model.Name),
"splitOn": "\n",
}

return arg
}

func figArgsJson(models []*kingpin.ArgModel) any {
func figArgsJson(models []*kingpin.ArgModel, specName string, fullCmd string) any {
if len(models) == 1 {
return figArgJson(models[0])
return figArgJson(models[0], specName, fullCmd)
} else {
var args []any
for _, model := range models {
args = append(args, figArgJson(model))
args = append(args, figArgJson(model, specName, fullCmd))
}
return args
}
}

func figSpecJson(model *kingpin.ApplicationModel) any {
func figSpecJson(model *kingpin.ApplicationModel, name string) any {
return map[string]interface{}{
"name": model.Name,
"name": name,
"description": model.Help,
"subcommands": figSubcommandsJson(model.Commands),
"options": figFlagsJson(model.Flags),
"subcommands": figSubcommandsJson(model.Commands, name),
"options": figFlagsJson(model.Flags, name, ""),
}
}

func figSubcommandJson(model *kingpin.CmdModel) any {
func figSubcommandJson(model *kingpin.CmdModel, specName string) any {
var subcommand = map[string]interface{}{
"name": model.Name,
}
Expand All @@ -100,31 +107,33 @@ func figSubcommandJson(model *kingpin.CmdModel) any {
}

if len(model.Commands) > 0 {
subcommand["subcommands"] = figSubcommandsJson(model.Commands)
subcommand["subcommands"] = figSubcommandsJson(model.Commands, specName)
}

if len(model.Flags) > 0 {
subcommand["options"] = figFlagsJson(model.Flags)
subcommand["options"] = figFlagsJson(model.Flags, specName, model.FullCommand)
}

if len(model.Args) > 0 {
subcommand["args"] = figArgsJson(model.Args)
subcommand["args"] = figArgsJson(model.Args, specName, model.FullCommand)
}

return subcommand
}

func figSubcommandsJson(models []*kingpin.CmdModel) []any {
func figSubcommandsJson(models []*kingpin.CmdModel, specName string) []any {
var subcommands []any
for _, model := range models {
subcommands = append(subcommands, figSubcommandJson(model))
subcommands = append(subcommands, figSubcommandJson(model, specName))
}
return subcommands
}

func GenerateFigCompletionSpec(a *kingpin.Application) func(c *kingpin.ParseContext) error {
return func(c *kingpin.ParseContext) error {
var marsheledJson, err = json.MarshalIndent(figSpecJson(a.Model()), "", " ")
var name = c.Elements[len(c.Elements)-1].Value

var marsheledJson, err = json.MarshalIndent(figSpecJson(a.Model(), *name), "", " ")
if err != nil {
return err
}
Expand Down