package org.icij.task; import org.icij.time.HumanDuration; import java.net.URI; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.Locale; import java.util.Optional; import java.util.function.Function; public class StringOptionParser implements OptionParser<String> { private final Option<String> option; public StringOptionParser(final Option<String> option) { this.option = option; } @Override public Optional<Duration> asDuration() { return option.value(HumanDuration::parse); } @Override public Optional<Path> asPath() { return option.value(Paths::get); } @Override public Optional<URI> asURI() { return option.value(URI::create); } @Override public Optional<Charset> asCharset() { return option.value((value)-> Charset.forName(value.toUpperCase())); } @Override public Optional<Integer> asInteger() { return option.value(Integer::valueOf); } @Override public Optional<Boolean> asBoolean() { return option.value(value-> { value = value.toLowerCase(Locale.ROOT); if (value.equals("yes") || value.equals("on") || value.equals("true") || value.equals("1")) { return Boolean.TRUE; } if (value.equals("no") || value.equals("off") || value.equals("false") || value.equals("0")) { return Boolean.FALSE; } throw new IllegalArgumentException(String.format("\"%s\" is not a valid value.", value)); }); } @Override public boolean isOn() { return asBoolean().orElse(Boolean.FALSE).equals(Boolean.TRUE); } @Override public boolean isOff() { return asBoolean().orElse(Boolean.TRUE).equals(Boolean.FALSE); } @Override public <E extends Enum<E>> Optional<E> asEnum(final Function<String, E> valueOf) { return option.value(valueOf); } }