По сути, у вас есть три слоя данных:
- Ваша схема конфигурации. Это определяет значения, которые должны быть определены в файле конфигурации.
- Сам файл конфигурации, который описывает обычную конфигурацию на текущем компьютере.
- Одноразовые переключатели, которые отменяют обычную конфигурацию.
Описание того, что каждое значение относится к схеме, а не к самому файлу конфигурации. Подумайте об этом: если кто-то отредактирует файл конфигурации на своем компьютере и изменит комментарии, ваш вывод справки внезапно покажет другое описание.
Я бы предложил добавить описания к схеме. Схема - это класс Java, в который вы загружаете свой YAML. Я не уверен, почему вы используете Джексона, так как он использует SnakeYaml в качестве парсера, а SnakeYaml прекрасно способен десериализовать в классы Java, но имеет больше опций конфигурации, поскольку он не обобщается на JSON и YAML, как это делает Джексон .
Вот общая идея, как это сделать с SnakeYaml (будьте осторожны, не проверено):
// ConfigParam.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConfigParam { String description(); }
// Configuration.java
public class Configuration {
@ConfigParam("Define a source directory")
String src;
@ConfigParam("Define a destination directory")
String dst;
}
// loading code
Yaml yaml = new Yaml(new Constructor(Configuration.class));
Configuration config = yaml.loadAs(input, Configuration.class);
// help generation code
System.out.println("Your program can be ran with the following options:")
for (Field field: Configuration.class.getFields()) {
ConfigParam ann = field.getAnnotation(ConfigParam.class);
if (ann != null) {
System.out.println(String.format("--%s %s", field.getName(), ann.description());
}
}
Для отображения фактических параметров в конфигурацию вы также можете циклически перебирать поля классов и сопоставлять параметры с именами полей после после загрузки конфигурации (чтобы заменить стандартные значения заданными).