package cobra import ( "fmt" commandmeta "go.maximumdirect.net/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 || kind == commandmeta.ShortFlagToken { offset := 1 consumedNext := false for { fact := commandmeta.ConsumeFlag(lookup, token, offset) if !fact.Found { if kind == commandmeta.ShortFlagToken { interpreted = append(interpreted, "-"+token[offset:]) } else { interpreted = append(interpreted, token) } return interpreted, spellings, occurrences, nil } flag, original := fact.Flag, fact.Spelling spellings[flag.Name] = append(spellings[flag.Name], original) value := fact.Value if fact.NeedsNext { if index+1 >= len(argv) { return interpreted, spellings, occurrences, &commandmeta.Failure{Message: fmt.Sprintf("flag needs an argument: %s", original)} } value = argv[index+1] consumedNext = true } if !fact.Attached && !fact.NeedsNext { value = "true" interpreted = append(interpreted, "--"+flag.Name) } else { interpreted = append(interpreted, "--"+flag.Name+"="+value) } occurrences = append(occurrences, commandmeta.FlagOccurrence{Name: flag.Name, Spelling: original, RawValue: value}) if fact.NextOffset == 0 { break } offset = fact.NextOffset } index++ if consumedNext { index++ } continue } interpreted = append(interpreted, token) index++ } return interpreted, spellings, occurrences, nil }