Traverse the command tree to find the command, and parse args for each parent.
(args []string)
| 819 | // Traverse the command tree to find the command, and parse args for |
| 820 | // each parent. |
| 821 | func (c *Command) Traverse(args []string) (*Command, []string, error) { |
| 822 | flags := []string{} |
| 823 | inFlag := false |
| 824 | |
| 825 | for i, arg := range args { |
| 826 | switch { |
| 827 | // A long flag with a space separated value |
| 828 | case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="): |
| 829 | // TODO: this isn't quite right, we should really check ahead for 'true' or 'false' |
| 830 | inFlag = !hasNoOptDefVal(arg[2:], c.Flags()) |
| 831 | flags = append(flags, arg) |
| 832 | continue |
| 833 | // A short flag with a space separated value |
| 834 | case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()): |
| 835 | inFlag = true |
| 836 | flags = append(flags, arg) |
| 837 | continue |
| 838 | // The value for a flag |
| 839 | case inFlag: |
| 840 | inFlag = false |
| 841 | flags = append(flags, arg) |
| 842 | continue |
| 843 | // A flag without a value, or with an `=` separated value |
| 844 | case isFlagArg(arg): |
| 845 | flags = append(flags, arg) |
| 846 | continue |
| 847 | } |
| 848 | |
| 849 | cmd := c.findNext(arg) |
| 850 | if cmd == nil { |
| 851 | return c, args, nil |
| 852 | } |
| 853 | |
| 854 | if err := c.ParseFlags(flags); err != nil { |
| 855 | return nil, args, err |
| 856 | } |
| 857 | return cmd.Traverse(args[i+1:]) |
| 858 | } |
| 859 | return c, args, nil |
| 860 | } |
| 861 | |
| 862 | // SuggestionsFor provides suggestions for the typedName. |
| 863 | func (c *Command) SuggestionsFor(typedName string) []string { |