我目前正在编写(或编写过)一个解析命令用法字符串并包含标志的系统,构建一个ParamsBase
对象(ParamsBase类:http://pastebin.com/5eHTijDw)。
我对ParamsBase
的创建没有任何问题 - 我已经对它进行了测试并且有效。下一步是我遇到问题。
我们假设我们将字符串/command subcommand <-f flag> <option1> [optional]
解析为ParamsBase
个对象。如果您阅读了代码,您就会知道这会生成具有以下属性的ParamsBase
:
长度:4(标志计为2,非参数参数不被考虑) 参数之前的参数:1(第一个参数之前有一个参数) 必需参数:3(&lt;&gt;表示必需,标志计为2) 可选参数:1([]表示可选)
我现在想将其解析为Params
对象(来源:http://pastebin.com/jsXmqU1Z)。我们假设用户输入以下字符串作为命令:/command subcommand -f value off on
。
现在将调用createParams
中的方法ParamsBase
。你不必担心Arguments
类的内容 - 为了我们的目的,它只是String[]
的包装器 - getArgument(int,boolean)只返回元素[ String[]
的int]。有效且invalidate
等也无关紧要。
但我的createParams
方法不起作用。根据给出的示例,我希望Params.get("option1")
返回off
,但它会返回on
。在createParams
方法中一定是个错误,这对某些人来说是显而易见的,但我有些困惑......
createParams
public Params createParams(Arguments args) {
Map<String, Parameter> map= new HashMap<>();
int curArgument = argsBeforeParams;
int curParam = 0;
while (true) {
if (curArgument >= args.length() || curParam >= params.size()) {
break;
}
map.put(info.getName(), new Parameter(args.getArgument(curArgument, true).get(), params.get(curParam)));
curArgument++;
curParam++;
}
return new Params(this, paramsMap);
}
我的测试代码:
final Arguments args = new Arguments(
"subcommand", "-f", "value", "off", "on");
final ParamsBase paramsBase = ParamsBase.fromUsageString(
"/command subcommand <-f flag> <option1> [optional]");
// Each flag counts as two arguments, hence 4 not 3
Assert.assertEquals("PB: Length", paramsBase.length(), 4);
// Each required flag counts as two required, hence 3 not 2
Assert.assertEquals("PB: Req", paramsBase.getAmountRequired(), 3);
Assert.assertEquals("PB: Opt", paramsBase.getAmountOptional(), 1);
Assert.assertEquals("PB: B4", 1, paramsBase.getArgsBeforeParams());
final Params params = args.withParams(
paramsBase.createParams(args)).getParams();
// Fails - on instead of off is given
Assert.assertEquals("PAR: LKUP", params.get("option1").get(), "off");