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) { lookup := commandmeta.NewFlagLookup(flags, aliases) spellings := make(map[string][]string) var occurrences []commandmeta.FlagOccurrence var interpreted []string for index := 0; index < len(argv); { token := argv[index] kind := commandmeta.ClassifyFlagToken(token) if kind == commandmeta.TerminatorToken { interpreted = append(interpreted, argv[index:]...) break } if kind == commandmeta.LongFlagToken { original, value, attached := commandmeta.SplitLongFlag(token) flag, ok := lookup.Find(original) if !ok { interpreted = append(interpreted, token) return interpreted, spellings, occurrences, nil } spellings[flag.Name] = append(spellings[flag.Name], original) if attached { 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 kind == commandmeta.ShortFlagToken { consumedNext := false for offset := 1; offset < len(token); { original := "-" + token[offset:offset+1] flag, ok := lookup.Find(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 }