parse and return a map of args, output and all errors
(doc string, argv []string, help bool, version string, optionsFirst bool)
| 68 | |
| 69 | // parse and return a map of args, output and all errors |
| 70 | func parse(doc string, argv []string, help bool, version string, optionsFirst bool) (args map[string]interface{}, output string, err error) { |
| 71 | if argv == nil && len(os.Args) > 1 { |
| 72 | argv = os.Args[1:] |
| 73 | } |
| 74 | |
| 75 | usageSections := parseSection("usage:", doc) |
| 76 | |
| 77 | if len(usageSections) == 0 { |
| 78 | err = newLanguageError("\"usage:\" (case-insensitive) not found.") |
| 79 | return |
| 80 | } |
| 81 | if len(usageSections) > 1 { |
| 82 | err = newLanguageError("More than one \"usage:\" (case-insensitive).") |
| 83 | return |
| 84 | } |
| 85 | usage := usageSections[0] |
| 86 | |
| 87 | options := parseDefaults(doc) |
| 88 | formal, err := formalUsage(usage) |
| 89 | if err != nil { |
| 90 | output = handleError(err, usage) |
| 91 | return |
| 92 | } |
| 93 | |
| 94 | pat, err := parsePattern(formal, &options) |
| 95 | if err != nil { |
| 96 | output = handleError(err, usage) |
| 97 | return |
| 98 | } |
| 99 | |
| 100 | patternArgv, err := parseArgv(newTokenList(argv, errorUser), &options, optionsFirst) |
| 101 | if err != nil { |
| 102 | output = handleError(err, usage) |
| 103 | return |
| 104 | } |
| 105 | patFlat, err := pat.flat(patternOption) |
| 106 | if err != nil { |
| 107 | output = handleError(err, usage) |
| 108 | return |
| 109 | } |
| 110 | patternOptions := patFlat.unique() |
| 111 | |
| 112 | patFlat, err = pat.flat(patternOptionSSHORTCUT) |
| 113 | if err != nil { |
| 114 | output = handleError(err, usage) |
| 115 | return |
| 116 | } |
| 117 | for _, optionsShortcut := range patFlat { |
| 118 | docOptions := parseDefaults(doc) |
| 119 | optionsShortcut.children = docOptions.unique().diff(patternOptions) |
| 120 | } |
| 121 | |
| 122 | if output = extras(help, version, patternArgv, doc); len(output) > 0 { |
| 123 | return |
| 124 | } |
| 125 | |
| 126 | err = pat.fix() |
| 127 | if err != nil { |
no test coverage detected