Noel Yap
Noel Yap

Reputation: 19758

How to create Groovy CliBuilder that passes through unknown options?

I have the following:

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."
}

I would like to be able to call it with:

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

such that there's no parsing error, without having to add --unknown-option to the list of accepted options, and such that both known-option-0 and known-option-1 are set.

If I set:

        stopAtNonOption: true,

no error is emitted, but:

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

How can I get all known options to be parsed and ignore unknown options?

Upvotes: 1

Views: 1135

Answers (1)

Noel Yap
Noel Yap

Reputation: 19758

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)

Upvotes: 1

Related Questions