2012-07-31 70 views
0

我有以下几点:如何创建通过未知选项的Groovy CliBuilder?

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选项添加到接受的选项列表,并且设置已知选项0和已知选项1。

如果我设置:

 stopAtNonOption: true, 

没有错误发出,但:

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

我怎样才能得到所有的已知选项被解析并忽略未知的选项?

回答

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)