From 123eabca54992a270096c83dd0f60090642b0ff8 Mon Sep 17 00:00:00 2001 From: bth Date: Sat, 17 Jan 2026 22:27:09 -0800 Subject: [PATCH] insane reflection premature optimization --- tag/tag.go | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tag/tag.go b/tag/tag.go index 3d1cec9..672abc7 100644 --- a/tag/tag.go +++ b/tag/tag.go @@ -4,15 +4,19 @@ import ( "fmt" "reflect" "strings" + "unicode" ) var opts struct { - query string `name:"query" help:"tag query"` - invert bool `name:"invert" help:"invert match"` + Query string `name:"query" help:"tag query"` + Invert bool `name:"invert" help:"invert match"` } -func stripDashes(flag string) string { - return strings.TrimPrefix(flag, "--") +func flagToField(flag string) string { + s := strings.TrimPrefix(flag, "--") + r := []rune(s) + r[0] = unicode.ToUpper(r[0]) + return string(r) } func Tag(args []string) { @@ -22,7 +26,7 @@ func Tag(args []string) { field := reflect.StructField{} found := false for _, a := range args { - field, found = t.FieldByName(stripDashes(a)) + field, found = t.FieldByName(flagToField(a)) if !found { fmt.Printf("%s not found in opts\n", a) return @@ -33,6 +37,17 @@ func Tag(args []string) { fmt.Printf("field name: %#v\n", tag.Get("name")) fmt.Printf("field help: %#v\n", tag.Get("help")) + v := reflect.ValueOf(opts) + vfield := reflect.Value{} + for _, a := range args { + vfield = v.FieldByName(flagToField(a)) + if vfield.IsValid() && vfield.CanSet() && vfield.Kind() == reflect.Bool { + vfield.SetBool(true) + fmt.Printf("vfield: %#v\n", vfield) + } + } + fmt.Printf("vfield: %#v\n", vfield) + fmt.Printf("opts: %#v\n", opts) // for i := 0; i < t.NumField(); i++ { // field := t.Field(i) // if alias, ok := field.Tag.Lookup("name"); ok {