Picocli: укажите значение по умолчанию для параметра, который имеет тип карты.

у меня такой вариант

    @CommandLine.Option(names = "-D", description = "Define a symbol.")
    /* A list of defines provided by the user. */
    Map<String, String> defines = new LinkedHashMap<String, String>();

Это работает, когда я делаю следующее:

-Dkey=value

однако, когда я делаю это

-Dkey

это не работает. Есть ли способ добавить значение по умолчанию для ключей, с которыми не связано значение?


person Har    schedule 25.10.2019    source источник


Ответы (1)


Этого можно добиться с помощью настраиваемого параметраConsumer. Например:

/* A list of defines provided by the user. */
@Option(names = "-D", parameterConsumer = MyMapParameterConsumer.class,
  description = "Define a symbol.")
Map<String, String> defines = new LinkedHashMap<String, String>();

... где MyMapParameterConsumer может выглядеть примерно так:


class MyMapParameterConsumer implements IParameterConsumer {
    @Override
    public void consumeParameters(
            Stack<String> args, 
            ArgSpec argSpec, 
            CommandSpec commandSpec) {

        if (args.isEmpty()) {
            throw new ParameterException(commandSpec.commandLine(), 
                    "Missing required parameter");
        }
        String parameter = args.pop();
        String[] keyValue = parameter.split("=", 1);
        String key = keyValue[0];
        String value = keyValue.length > 1 
                ? keyValue[1]
                : "MY_DEFAULT";
        Map<String, String> map = argSpec.getValue();
        map.put(key, value);
    }
}
person Remko Popma    schedule 26.10.2019
comment
Я не понимаю аргументы. Означает ли это общее количество аргументов, а не аргумент для пары -Dkey=value? - person Har; 01.11.2019
comment
Когда вызывается метод consumeParameters, параметр -D уже используется, но его параметры все еще находятся в стеке. Когда параметр был присоединен к опции (как в -Dkey=value), синтаксический анализатор отсоединил параметр и поместил его обратно в стек. Таким образом, параметр key=value должен быть наверху стека, за ним следуют остальные аргументы командной строки. - person Remko Popma; 01.11.2019