private void consumeOneMapArgument(ArgSpec argSpec, LookBehind lookBehind, Range arity, int consumed, String arg, Class<?>[] classes, ITypeConverter<?> keyConverter, ITypeConverter<?> valueConverter, Map<Object, Object> result, int index, String argDescription) { if (!lookBehind.isAttached()) { parseResult.nowProcessing(argSpec, arg); } String raw = trim(arg); String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); for (String value : values) { String[] keyValue = splitKeyValue(argSpec, value); Object mapKey = tryConvert(argSpec, index, keyConverter, keyValue[0], classes[0]); Object mapValue = tryConvert(argSpec, index, valueConverter, keyValue[1], classes[1]); result.put(mapKey, mapValue); if (tracer.isInfo()) { tracer.info("Putting [%s : %s] in %s<%s, %s> %s for %s%n", String.valueOf(mapKey), String.valueOf(mapValue), result.getClass().getSimpleName(), classes[0].getSimpleName(), classes[1].getSimpleName(), argSpec.toString(), argDescription); } parseResult.addStringValue(argSpec, keyValue[0]); parseResult.addStringValue(argSpec, keyValue[1]); } parseResult.addOriginalStringValue(argSpec, raw); }
private int consumeOneArgument(ArgSpec argSpec, LookBehind lookBehind, Range arity, int consumed, String arg, Class<?> type, List<Object> result, int index, String argDescription) { if (!lookBehind.isAttached()) { parseResult.nowProcessing(argSpec, arg); } String raw = trim(arg); String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); ITypeConverter<?> converter = getTypeConverter(type, argSpec, 0); for (int j = 0; j < values.length; j++) { result.add(tryConvert(argSpec, index, converter, values[j], type)); if (tracer.isInfo()) { tracer.info("Adding [%s] to %s for %s%n", String.valueOf(result.get(result.size() - 1)), argSpec.toString(), argDescription); } parseResult.addStringValue(argSpec, values[j]); } parseResult.addOriginalStringValue(argSpec, raw); return ++index; } private boolean canConsumeOneArgument(ArgSpec argSpec, Range arity, int consumed, String arg, Class<?> type, String argDescription) {
int available = args.size(); if (available > 0 && commandSpec.parser().splitFirst() && argSpec.splitRegex().length() > 0) { available += argSpec.splitValue(args.peek(), commandSpec.parser(), arity, 0).length - 1;
int available = args.size(); if (available > 0 && commandSpec.parser().splitFirst() && argSpec.splitRegex().length() > 0) { available += argSpec.splitValue(args.peek(), commandSpec.parser(), arity, 0).length - 1;
private int consumeOneArgument(ArgSpec argSpec, LookBehind lookBehind, Range arity, int consumed, String arg, Class<?> type, List<Object> result, int index, String argDescription) { if (!lookBehind.isAttached()) { parseResult.nowProcessing(argSpec, arg); } String raw = trim(arg); String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); ITypeConverter<?> converter = getTypeConverter(type, argSpec, 0); for (int j = 0; j < values.length; j++) { result.add(tryConvert(argSpec, index, converter, values[j], type)); if (tracer.isInfo()) { tracer.info("Adding [%s] to %s for %s%n", String.valueOf(result.get(result.size() - 1)), argSpec.toString(), argDescription); } parseResult.addStringValue(argSpec, values[j]); } parseResult.addOriginalStringValue(argSpec, raw); return ++index; } private boolean canConsumeOneArgument(ArgSpec argSpec, Range arity, int consumed, String arg, Class<?> type, String argDescription) {
private void consumeOneMapArgument(ArgSpec argSpec, LookBehind lookBehind, Range arity, int consumed, String arg, Class<?>[] classes, ITypeConverter<?> keyConverter, ITypeConverter<?> valueConverter, Map<Object, Object> result, int index, String argDescription) { if (!lookBehind.isAttached()) { parseResult.nowProcessing(argSpec, arg); } String raw = trim(arg); String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); for (String value : values) { String[] keyValue = splitKeyValue(argSpec, value); Object mapKey = tryConvert(argSpec, index, keyConverter, keyValue[0], classes[0]); Object mapValue = tryConvert(argSpec, index, valueConverter, keyValue[1], classes[1]); result.put(mapKey, mapValue); if (tracer.isInfo()) { tracer.info("Putting [%s : %s] in %s<%s, %s> %s for %s%n", String.valueOf(mapKey), String.valueOf(mapValue), result.getClass().getSimpleName(), classes[0].getSimpleName(), classes[1].getSimpleName(), argSpec.toString(), argDescription); } parseResult.addStringValue(argSpec, keyValue[0]); parseResult.addStringValue(argSpec, keyValue[1]); } parseResult.addOriginalStringValue(argSpec, raw); }
private boolean canConsumeOneMapArgument(ArgSpec argSpec, Range arity, int consumed, String raw, Class<?>[] classes, ITypeConverter<?> keyConverter, ITypeConverter<?> valueConverter, String argDescription) { String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); try { for (String value : values) { String[] keyValue = splitKeyValue(argSpec, value); tryConvert(argSpec, -1, keyConverter, keyValue[0], classes[0]); tryConvert(argSpec, -1, valueConverter, keyValue[1], classes[1]); } return true; } catch (PicocliException ex) { tracer.debug("$s cannot be assigned to %s: type conversion fails: %s.%n", raw, argDescription, ex.getMessage()); return false; } }
private boolean canConsumeOneArgument(ArgSpec argSpec, Range arity, int consumed, String arg, Class<?> type, String argDescription) { ITypeConverter<?> converter = getTypeConverter(type, argSpec, 0); try { String[] values = argSpec.splitValue(trim(arg), commandSpec.parser(), arity, consumed); // if (!argSpec.acceptsValues(values.length, commandSpec.parser())) { // tracer.debug("$s would split into %s values but %s cannot accept that many values.%n", arg, values.length, argDescription); // return false; // } for (String value : values) { tryConvert(argSpec, -1, converter, value, type); } return true; } catch (PicocliException ex) { tracer.debug("$s cannot be assigned to %s: type conversion fails: %s.%n", arg, argDescription, ex.getMessage()); return false; } }
@Test public void testArgSpecSplitValue_SplitsQuotedValuesIfConfigured() { ParserSpec parser = new ParserSpec().splitQuotedStrings(true); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c", "d" , "e\"", "f"}, actual); }
@Test public void testArgSpecSplitValue_MultipleQuotedValues() { ParserSpec parser = new ParserSpec(); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f,\"xxx,yyy\"", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c,d,e\"", "f", "\"xxx,yyy\""}, actual); }
@Test public void testArgSpecSplitValue_MultipleQuotedValues_QuotesTrimmedIfRequested() { ParserSpec parser = new ParserSpec().trimQuotes(true); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f,\"xxx,yyy\"", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "c,d,e", "f", "xxx,yyy"}, actual); }
@Test public void testArgSpecSplitValue_RespectsQuotedValuesByDefault() { ParserSpec parser = new ParserSpec(); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c,d,e\"", "f"}, actual); }
private boolean canConsumeOneArgument(ArgSpec argSpec, Range arity, int consumed, String arg, Class<?> type, String argDescription) { ITypeConverter<?> converter = getTypeConverter(type, argSpec, 0); try { String[] values = argSpec.splitValue(trim(arg), commandSpec.parser(), arity, consumed); // if (!argSpec.acceptsValues(values.length, commandSpec.parser())) { // tracer.debug("$s would split into %s values but %s cannot accept that many values.%n", arg, values.length, argDescription); // return false; // } for (String value : values) { tryConvert(argSpec, -1, converter, value, type); } return true; } catch (PicocliException ex) { tracer.debug("$s cannot be assigned to %s: type conversion fails: %s.%n", arg, argDescription, ex.getMessage()); return false; } }
private boolean canConsumeOneMapArgument(ArgSpec argSpec, Range arity, int consumed, String raw, Class<?>[] classes, ITypeConverter<?> keyConverter, ITypeConverter<?> valueConverter, String argDescription) { String[] values = argSpec.splitValue(raw, commandSpec.parser(), arity, consumed); try { for (String value : values) { String[] keyValue = splitKeyValue(argSpec, value); tryConvert(argSpec, -1, keyConverter, keyValue[0], classes[0]); tryConvert(argSpec, -1, valueConverter, keyValue[1], classes[1]); } return true; } catch (PicocliException ex) { tracer.debug("$s cannot be assigned to %s: type conversion fails: %s.%n", raw, argDescription, ex.getMessage()); return false; } }
@Test public void testArgSpecSplitValue_MultipleQuotedValues_QuotesTrimmedIfRequested() { ParserSpec parser = new ParserSpec().trimQuotes(true); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f,\"xxx,yyy\"", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "c,d,e", "f", "xxx,yyy"}, actual); }
@Test public void testArgSpecSplitValue_RespectsQuotedValuesByDefault() { ParserSpec parser = new ParserSpec(); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c,d,e\"", "f"}, actual); }
@Test public void testArgSpecSplitValue_SplitsQuotedValuesIfConfigured() { ParserSpec parser = new ParserSpec().splitQuotedStrings(true); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c", "d" , "e\"", "f"}, actual); }
@Test public void testArgSpecSplitValue_MultipleQuotedValues() { ParserSpec parser = new ParserSpec(); ArgSpec spec = PositionalParamSpec.builder().splitRegex(",").build(); String[] actual = spec.splitValue("a,b,\"c,d,e\",f,\"xxx,yyy\"", parser, Range.valueOf("0"), 0); assertArrayEquals(new String[]{"a", "b", "\"c,d,e\"", "f", "\"xxx,yyy\""}, actual); }