package de.axone.funky;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import de.axone.funky.types.ArgumentTypes;
import de.axone.tools.S;
import de.axone.tools.Text;
public class FunctionDescriptionImpl implements FunctionDescription {
private final String name;
private String description;
private List<Argument<?,?>> arguments = new LinkedList<>();
public FunctionDescriptionImpl( String name ){
this.name = name;
}
public FunctionDescriptionImpl description( String description ){
this.description = description;
return this;
}
public FunctionDescriptionImpl argument( Argument<?,?> argument ) {
arguments.add( argument );
return this;
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl required( T type, String name, String description ) {
ArgumentImpl<C,T> arg = ArgumentImpl.Required( type, name, description );
return argument( arg );
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl required( String name, String description ) {
return required( ArgumentTypes.STRING, name, description );
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl required( T type, String name ) {
return required( type, name, null );
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl optional( T type, String name, String description ) {
ArgumentImpl<C,T> arg = ArgumentImpl.Optional( type, name, description );
return argument( arg );
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl optional( String name, String description ) {
return optional( ArgumentTypes.STRING, name, description );
}
public <C,T extends ArgumentType<C>> FunctionDescriptionImpl optional( T type, String name ) {
return optional( type, name, null );
}
@Override
public String name() {
return name;
}
@Override
public String description() {
return description;
}
@Override
public List<Argument<?, ?>> arguments() {
return Collections.unmodifiableList( arguments );
}
@Override
public String toString(){
StringBuilder result = new StringBuilder();
result.append( name() );
for( Argument<?,?> argument : arguments ){
result.append( " " ).append( argument.name() );
}
result.append( S.nl ).append( Text.line( '-', 79 ) ).append( S.nl );
for( Argument<?,?> argument : arguments ){
result.append( argument ).append( S.nl );
}
return result.toString();
}
}