diff options
Diffstat (limited to 'compflag/gen')
| -rw-r--r-- | compflag/gen/flags.go.gotmpl | 83 | ||||
| -rw-r--r-- | compflag/gen/main.go | 67 |
2 files changed, 150 insertions, 0 deletions
diff --git a/compflag/gen/flags.go.gotmpl b/compflag/gen/flags.go.gotmpl new file mode 100644 index 0000000..9b65dd5 --- /dev/null +++ b/compflag/gen/flags.go.gotmpl @@ -0,0 +1,83 @@ +package compflag + +// Code auto generated with `go run ./gen`. DO NOT EDIT + +//go:generate go run ./gen + + +{{ range . }} + +// {{ .Name }} if a flag function for a flag of type {{ .Type }}. +func {{ .Name }}(name string, value {{ .Type }}, usage string, options ...predict.Option) *{{ .Type }} { + return CommandLine.{{ .Name }}(name, value, usage, options...) +} + +// {{ .Name }}Var if a flag function for a flag of already exiting variable of type {{ .Type }}. +func {{ .Name }}Var(v *{{ .Type }}, name string, value {{ .Type }}, usage string, options ...predict.Option) { + CommandLine.{{ .Name }}Var(v, name, value, usage, options...) +} + +{{ end }} + +{{ range . }} + +// {{ .Name }} if a flag function for a flag of type {{ .Type }}. +func (fs *FlagSet) {{ .Name }}(name string, value {{ .Type }}, usage string, options ...predict.Option) *{{ .Type }} { + p := new({{ .Type }}) + fs.{{.Name}}Var(p, name, value, usage, options...) + return p +} + +// {{ .Name }}Var if a flag function for a flag of already exiting variable of type {{ .Type }}. +func (fs *FlagSet) {{ .Name }}Var(p *{{ .Type }}, name string, value {{ .Type }}, usage string, options ...predict.Option) { + (*flag.FlagSet)(fs).Var({{ .NewInternalTypeFuncName }}(value, p, predict.Options(options...)), name, usage) +} + +{{ end }} + +{{ range . }} + +// ============================================================================================== // + +type {{ .InternalTypeName }} struct { + v *{{ .Type }} + predict.Config +} + +func {{ .NewInternalTypeFuncName }}(val {{ .Type }}, p *{{ .Type }}, c predict.Config) *{{ .InternalTypeName }} { + *p = val + return &{{ .InternalTypeName}} {v: p, Config: c} +} + +func (v *{{ .InternalTypeName }}) Set(val string) error { + var err error + *v.v, err = parse{{ .Name }}(val) + if err != nil { + return fmt.Errorf("bad value for {{ .Name }} flag") + } + return v.Check(val) +} + +func (v *{{ .InternalTypeName }}) Get() interface{} { + return *v.v +} + +func (v *{{ .InternalTypeName }}) String() string { + if v == nil || v.v == nil { + return "" + } + return format{{ .Name }}(*v.v) +} + +{{ if .IsBool }} +func (v *{{ .InternalTypeName }}) IsBoolFlag() bool { return true } +{{ end}} + +func (v *{{ .InternalTypeName }}) Predict(prefix string) []string { + if v.Predictor != nil { + return v.Predictor.Predict(prefix) + } + return {{ if .CustomPredict }}predict{{ .Name }}(*v.v, prefix){{ else }}[]string{""}{{ end }} +} + +{{ end }}
\ No newline at end of file diff --git a/compflag/gen/main.go b/compflag/gen/main.go new file mode 100644 index 0000000..cbea96f --- /dev/null +++ b/compflag/gen/main.go @@ -0,0 +1,67 @@ +// Generates flags.go. +package main + +import ( + "log" + "os" + "path/filepath" + "strings" + "text/template" + + "github.com/posener/script" +) + +const tmplGlob = "gen/*.go.gotmpl" + +type flag struct { + Name string + Type string + IsBool bool + CustomPredict bool +} + +func (f flag) NewInternalTypeFuncName() string { + return "new" + strings.Title(f.InternalTypeName()) +} + +func (f flag) InternalTypeName() string { + return strings.ToLower(f.Name[:1]) + f.Name[1:] + "Value" +} + +var flags = []flag{ + {Name: "String", Type: "string"}, + {Name: "Bool", Type: "bool", IsBool: true, CustomPredict: true}, + {Name: "Int", Type: "int"}, + {Name: "Duration", Type: "time.Duration"}, +} + +var tmpl = template.Must(template.ParseGlob(tmplGlob)) + +func main() { + for _, t := range tmpl.Templates() { + fileName := outFileName(t.Name()) + f, err := os.Create(fileName) + if err != nil { + panic(err) + } + defer f.Close() + + log.Printf("Writing %s", fileName) + err = t.Execute(f, flags) + if err != nil { + panic(err) + } + + // Format the file. + err = script.ExecHandleStderr(os.Stderr, "goimports", "-w", fileName).ToStdout() + if err != nil { + panic(err) + } + } +} + +func outFileName(templateName string) string { + name := filepath.Base(templateName) + // Remove .gotmpl suffix. + return name[:strings.LastIndex(name, ".")] +} |
