package cobra import ( "fmt" "strings" commandmeta "gitea.maximumdirect.net/eric/CommandKit/internal/commandmeta" ) func interpretFlagTokens(argv []string, flags []commandmeta.Flag, aliases []commandmeta.FlagAlias) ([]string, map[string][]string, []commandmeta.FlagOccurrence, *commandmeta.Failure) { canonical := make(map[string]commandmeta.Flag, len(flags)*2+2) help := commandmeta.Flag{Name: "help", Short: "h", Boolean: true} canonical["--help"] = help canonical["-h"] = help for _, flag := range flags { canonical["--"+flag.Name] = flag if flag.Short != "" { canonical["-"+flag.Short] = flag } } byAlias := make(map[string]commandmeta.Flag, len(aliases)) for _, alias := range aliases { if target, ok := canonical[alias.Target]; ok { byAlias[alias.Source] = target } } spellings := make(map[string][]string) var occurrences []commandmeta.FlagOccurrence var interpreted []string for index := 0; index < len(argv); { token := argv[index] if token == "--" { interpreted = append(interpreted, argv[index:]...) break } if strings.HasPrefix(token, "--") && len(token) > 2 { body := token[2:] equal := strings.IndexByte(body, '=') inputName := body if equal >= 0 { inputName = body[:equal] } original := "--" + inputName flag, ok := canonical[original] if !ok { flag, ok = byAlias[original] } if !ok { interpreted = append(interpreted, token) return interpreted, spellings, occurrences, nil } spellings[flag.Name] = append(spellings[flag.Name], original) if equal >= 0 { value := body[equal+1:] interpreted = append(interpreted, "--"+flag.Name+"="+value) occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) index++ continue } if !flag.Boolean && index+1 < len(argv) { value := argv[index+1] interpreted = append(interpreted, "--"+flag.Name+"="+value) occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) index += 2 continue } if !flag.Boolean { return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)} } occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: "true"}) interpreted = append(interpreted, "--"+flag.Name) index++ continue } if len(token) > 1 && token[0] == '-' { if token == "-" { interpreted = append(interpreted, token) index++ continue } consumedNext := false for offset := 1; offset < len(token); { original := "-" + token[offset:offset+1] flag, ok := canonical[original] if !ok { flag, ok = byAlias[original] } if !ok { interpreted = append(interpreted, "-"+token[offset:]) return interpreted, spellings, occurrences, nil } spellings[flag.Name] = append(spellings[flag.Name], original) suffix := token[offset+1:] if flag.Boolean { if strings.HasPrefix(suffix, "=") { value := suffix[1:] interpreted = append(interpreted, "--"+flag.Name+"="+value) occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) break } occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: "true"}) interpreted = append(interpreted, "--"+flag.Name) offset++ continue } if suffix != "" { value := suffix if strings.HasPrefix(value, "=") { value = value[1:] } interpreted = append(interpreted, "--"+flag.Name+"="+value) occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) break } if index+1 < len(argv) { value := argv[index+1] interpreted = append(interpreted, "--"+flag.Name+"="+value) occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) index += 2 consumedNext = true break } return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)} } if !consumedNext { index++ } continue } interpreted = append(interpreted, token) index++ } return interpreted, spellings, occurrences, nil }