package de.axone.funky;
import java.util.LinkedList;
import java.util.List;
import de.axone.tools.S;
public class ArgumentImpl<V,AT extends ArgumentType<V>> implements Argument<V,AT> {
private final AT type;
private final String name;
private String
shortName,
description,
longDescription;
private boolean
optional,
positional;
private List<ArgumentValidator<V>>
validators = new LinkedList<>();
private V defaultValue;
public ArgumentImpl( AT type, String name, String shortName, String description, String longDescription, boolean optional, boolean positional ) {
this.type = type;
this.name = name;
this.shortName = shortName;
this.description = description;
this.longDescription = longDescription;
this.optional = optional;
this.positional = positional;
}
public static <X, Y extends ArgumentType<X>> ArgumentImpl<X,Y> Optional( Y type, String name, String description ){
return new ArgumentImpl<X,Y>( type, name, null, null, null, true, false );
}
public static <X, Y extends ArgumentType<X>> ArgumentImpl<X,Y> Required( Y type, String name, String description ){
return new ArgumentImpl<X,Y>( type, name, null, null, null, false, true );
}
@Override
public AT type() {
return type;
}
@Override
public String name() {
return name;
}
public ArgumentImpl<V,AT> shortName( String shortName ){
this.shortName = shortName;
return this;
}
@Override
public String shortName() {
return shortName;
}
@Override
public String description() {
return description;
}
public ArgumentImpl<V,AT> description( String description ){
this.description = description;
return this;
}
@Override
public boolean optional() {
return optional;
}
public ArgumentImpl<V,AT> optional( boolean optional ){
this.optional = optional;
return this;
}
@Override
public boolean positional() {
return positional;
}
public ArgumentImpl<V,AT> positional( boolean positional ){
this.positional = positional;
return this;
}
@Override
public String longDescription() {
return longDescription;
}
public ArgumentImpl<V,AT> longDescription( String longDescription ){
this.longDescription = longDescription;
return this;
}
@Override
public V defaultValue() {
return defaultValue;
}
public ArgumentImpl<V,AT> defaultValue( V defaultValue ){
this.defaultValue = defaultValue;
return this;
}
public ArgumentImpl<V,AT> validate( ArgumentValidator<V> validator ){
this.validators.add( validator );
return this;
}
@Override
public List<ArgumentValidator<V>> validators() {
return validators;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append( name );
if( type != null )
builder.append( " [" ).append( type.name() ).append( "]" );
if( shortName != null )
builder.append( " (" ).append( shortName ).append( ")" );
if( optional ) builder.append( "(o)" );
if( positional ) builder.append( "(p)" );
if( description != null )
builder.append( " " ).append( description );
if( longDescription != null )
builder.append( S.nl ).append( longDescription );
if( validators != null )
for( ArgumentValidator<V> validator : validators )
builder.append( validator );
return builder.toString();
}
}