package io.bootique.meta.application;
import io.bootique.meta.MetadataNode;
/**
* A descriptor of a command-line option.
*
* @since 0.20
*/
public class OptionMetadata implements MetadataNode {
private String name;
private String description;
private String shortName;
private OptionValueCardinality valueCardinality;
private String valueName;
public static Builder builder(String name) {
return new Builder().name(name);
}
public static Builder builder(String name, String description) {
return new Builder().name(name).description(description);
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
/**
* @return option short name.
* @since 0.21
*/
public String getShortName() {
return (shortName != null) ? shortName : name.substring(0, 1);
}
public OptionValueCardinality getValueCardinality() {
return valueCardinality;
}
public String getValueName() {
return valueName;
}
public static class Builder {
private OptionMetadata option;
private Builder() {
this.option = new OptionMetadata();
this.option.valueCardinality = OptionValueCardinality.NONE;
}
public Builder name(String name) {
this.option.name = validateName(name);
return this;
}
public Builder shortName(String shortName) {
option.shortName = validateShortName(shortName);
return this;
}
public Builder shortName(char shortName) {
option.shortName = String.valueOf(shortName);
return this;
}
public Builder description(String description) {
this.option.description = description;
return this;
}
public Builder valueRequired() {
return valueRequired("");
}
public Builder valueRequired(String valueName) {
this.option.valueCardinality = OptionValueCardinality.REQUIRED;
this.option.valueName = valueName;
return this;
}
public Builder valueOptional() {
return valueOptional("");
}
public Builder valueOptional(String valueName) {
this.option.valueCardinality = OptionValueCardinality.OPTIONAL;
this.option.valueName = valueName;
return this;
}
public OptionMetadata build() {
validateName(option.name);
return option;
}
private String validateName(String name) {
if (name == null) {
throw new IllegalArgumentException("Null 'name'");
}
if (name.length() == 0) {
throw new IllegalArgumentException("Empty 'name'");
}
return name;
}
private String validateShortName(String shortName) {
if (shortName == null) {
throw new IllegalArgumentException("Null 'shortName'");
}
if (shortName.length() != 1) {
throw new IllegalArgumentException("'shortName' must be exactly one char long: " + shortName);
}
return shortName;
}
}
}