summaryrefslogtreecommitdiff
path: root/compflag/gen
diff options
context:
space:
mode:
Diffstat (limited to 'compflag/gen')
-rw-r--r--compflag/gen/flags.go.gotmpl83
-rw-r--r--compflag/gen/main.go67
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, ".")]
+}