package commandmeta import "strings" // FlagTokenKind identifies the portion of the shared option grammar a token uses. type FlagTokenKind uint8 const ( OperandToken FlagTokenKind = iota TerminatorToken LongFlagToken ShortFlagToken ) // ClassifyFlagToken distinguishes option tokens without consuming their values. func ClassifyFlagToken(token string) FlagTokenKind { if token == "--" { return TerminatorToken } if strings.HasPrefix(token, "--") && len(token) > 2 { return LongFlagToken } if len(token) > 1 && token[0] == '-' { return ShortFlagToken } return OperandToken } // SplitLongFlag separates the entered spelling from an optional attached value. func SplitLongFlag(token string) (spelling, value string, attached bool) { return strings.Cut(token, "=") } // FlagLookup maps canonical and applicable alias spellings to neutral flags. type FlagLookup struct { canonical map[string]Flag aliases map[string]Flag } // NewFlagLookup includes the built-in help flag alongside the supplied flags. func NewFlagLookup(flags []Flag, aliases []FlagAlias) FlagLookup { canonical := make(map[string]Flag, len(flags)*2+2) help := HelpFlag() canonical["--help"], canonical["-h"] = help, help for _, flag := range flags { canonical["--"+flag.Name] = flag if flag.Short != "" { canonical["-"+flag.Short] = flag } } lookup := FlagLookup{canonical: canonical, aliases: make(map[string]Flag, len(aliases))} for _, alias := range aliases { if target, ok := canonical[alias.Target]; ok { lookup.aliases[alias.Source] = target } } return lookup } // Find returns the canonical flag for an entered spelling. func (lookup FlagLookup) Find(spelling string) (Flag, bool) { flag, ok := lookup.canonical[spelling] if !ok { flag, ok = lookup.aliases[spelling] } return flag, ok }