generateCommand generates command string from given context, app command, default flags and urls.
(c *cli.Context, cmd string, defaultFlags map[string]interface{}, urls ...*url.URL)
| 63 | |
| 64 | // generateCommand generates command string from given context, app command, default flags and urls. |
| 65 | func generateCommand(c *cli.Context, cmd string, defaultFlags map[string]interface{}, urls ...*url.URL) (string, error) { |
| 66 | command := AppCommand(cmd) |
| 67 | flagset := flag.NewFlagSet(command.Name, flag.ContinueOnError) |
| 68 | |
| 69 | var args []string |
| 70 | for _, url := range urls { |
| 71 | args = append(args, fmt.Sprintf("%q", url.String())) |
| 72 | } |
| 73 | |
| 74 | flags := []string{} |
| 75 | for flagname, flagvalue := range defaultFlags { |
| 76 | flags = append(flags, fmt.Sprintf("--%s='%v'", flagname, flagvalue)) |
| 77 | } |
| 78 | |
| 79 | isDefaultFlag := func(flagname string) bool { |
| 80 | _, ok := defaultFlags[flagname] |
| 81 | return ok |
| 82 | } |
| 83 | |
| 84 | for _, f := range command.Flags { |
| 85 | flagname := f.Names()[0] |
| 86 | if isDefaultFlag(flagname) || !c.IsSet(flagname) { |
| 87 | continue |
| 88 | } |
| 89 | |
| 90 | for _, flagvalue := range contextValue(c, flagname) { |
| 91 | flags = append(flags, fmt.Sprintf("--%s='%s'", flagname, flagvalue)) |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | sort.Strings(flags) |
| 96 | flags = append(flags, args...) |
| 97 | flags = append([]string{command.Name}, flags...) |
| 98 | |
| 99 | err := flagset.Parse(flags) |
| 100 | if err != nil { |
| 101 | return "", err |
| 102 | } |
| 103 | |
| 104 | cmdCtx := cli.NewContext(c.App, flagset, c) |
| 105 | return strings.TrimSpace(commandFromContext(cmdCtx)), nil |
| 106 | } |