package org.icij.task; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.function.Function; public class Options<T> implements Iterable<Option<T>> { protected final Map<String, Option<T>> map = new HashMap<>(); public Option<T> get(final String name) { return map.get(name); } public Option<T> get(final Option<T> option) { return map.get(option.name()); } public Options<T> add(final Option<T> option) { map.put(option.name(), option); return this; } public Option<T> add(final String name, final Function<Option<T>, OptionParser<T>> parser) { final Option<T> option = new Option<>(name, parser); add(option); return option; } public Option<T> add(final org.icij.task.annotation.Option option, final Function<Option<T>, OptionParser<T>> parser) { return add(option.name(), parser).describe(option.description()) .parameter(option.parameter()) .code(option.code()); } public void add(final org.icij.task.annotation.OptionsClass optionsClass, final Function<Option<T>, OptionParser<T>> parser) { for (org.icij.task.annotation.Option option : optionsClass.value() .getAnnotationsByType(org.icij.task.annotation.Option.class)) { add(option, parser); } // Recursively import other Options from OptionsClass annotations. for (org.icij.task.annotation.OptionsClass otherClass : optionsClass.value() .getAnnotationsByType(org.icij.task.annotation.OptionsClass.class)) { add(otherClass, parser); } } @Override public Iterator<Option<T>> iterator() { return new OptionsIterator<>(map); } }