1

我有以下内容:

final String scriptName = new File(getClass().protectionDomain.codeSource.location.path).getName()
final cli = new CliBuilder(
        stopAtNonOption: false,
        usage: "${scriptName} ARGUMENTS",
        width: 80)
cli.with {
    _ longOpt: "known-option-0", args: 1, argName: "KNOWN_OPTION_0", "Known option."
    _ longOpt: "known-option-1", args: 1, argName: "KNOWN_OPTION_1", "Known option."
}

我希望能够通过以下方式调用它:

options = cli.parse(['--known-option-0=0', '--unknown-option=aoeu', '--known-option-1=1'])

这样就没有解析错误,无需将 --unknown-option 添加到接受的选项列表中,并且设置 known-option-0 和 known-option-1 。

如果我设置:

        stopAtNonOption: true,

没有发出错误,但是:

options.'known-option-0' == 0
options.'known-option-1' == false

如何获取所有已知选项进行解析并忽略未知选项?

4

1 回答 1

1
class CliParser {
    final CliBuilder cli
    final List<Cli> options_list = []
    final List<String> arguments_list = []

    CliParser(CliBuilder cli) {
        this.cli = cli
    }

    Collection getOptions() {
        cli.options.getOptions()
    }

    Cli parse(List<String> args) {
        while (args.size() != 0) {
            groovy.util.OptionAccessor options = cli.parse(args)
            options_list.add(options)

            List<String> arguments = options.arguments()
            arguments_list.add(arguments[0])

            args = (arguments.size() > 1) ? arguments[1..-1] : []
        }

        return new Cli(options: options_list, arguments: arguments_list)
    }
}

class Cli {
    List<groovy.util.OptionAccessor> options
    List<String> arguments

    List<String> arguments() {
        arguments
    }

    List<Option> getOptions() {
        options.collect {
            it.getOptions()
        }
    }

    Object getProperty(String name) {
        final optionAccessor = options
                .find {
                    it.hasOption(name)
                }

        optionAccessor?.getProperty(name)
    }
}

final String scriptName = new File(getClass().protectionDomain.codeSource.location.path).getName()
final cliBuilder = new CliBuilder(
        stopAtNonOption: false,
        usage: "${scriptName} ARGUMENTS",
        width: 80)
cliBuilder.with {
    _ longOpt: "known-option-0", args: 1, argName: "KNOWN_OPTION_0", "Known option."
    _ longOpt: "known-option-1", args: 1, argName: "KNOWN_OPTION_1", "Known option."
}

final cliParser = new CliParser(cliBuilder)
final cli = cliParser.parse(args)
于 2012-08-03T01:13:25.497 回答