VariantBuilderImpl.java

package io.github.jonloucks.variants.impl;

import io.github.jonloucks.variants.api.Variant;

import java.util.*;
import java.util.function.Function;
import java.util.function.Supplier;

import static io.github.jonloucks.contracts.api.Checks.nullCheck;
import static io.github.jonloucks.variants.api.Checks.keysCheck;
import static io.github.jonloucks.variants.impl.Internal.optionalOr;
import static java.util.Optional.ofNullable;

/**
 * Responsibility: Variant.Config.Builder implementation
 * @param <T> the value type of Variant
 */
final class VariantBuilderImpl<T> implements Variant.Config.Builder<T> {
    
    @Override
    public VariantBuilderImpl<T> name(String name) {
        this.name = name;
        return this;
    }
    
    @Override
    public VariantBuilderImpl<T> parser(Function<CharSequence, T> parser) {
        this.parser = parser;
        return this;
    }
    
    @Override
    public VariantBuilderImpl<T> description(String description) {
        this.description = description;
        return this;
    }
    
    @Override
    public VariantBuilderImpl<T> keys(Collection<String> keys) {
        this.keys.addAll(keysCheck(keys));
        return this;
    }
    
    @Override
    public VariantBuilderImpl<T> fallback(Supplier<T> fallback) {
        this.fallback = nullCheck(fallback, "Fallback must be present.");
        return this;
    }
    
    @Override
    public VariantBuilderImpl<T> link(Variant<T> link) {
        this.link = link;
        return this;
    }
    
    @Override
    public Optional<String> getName() {
        return optionalOr(ofNullable(name), () -> keys.stream().findFirst());
    }
    
    @Override
    public Optional<String> getDescription() {
        return ofNullable(description);
    }
    
    @Override
    public Optional<T> getFallback() {
        return ofNullable(fallback.get());
    }
    
    @Override
    public Optional<Variant<T>> getLink() {
        return ofNullable(link);
    }
    
    @Override
    public List<String> getKeys() {
        return new ArrayList<>(keys);
    }
    
    @Override
    public Optional<Function<CharSequence, T>> getParser() {
        return ofNullable(parser);
    }
    
    VariantBuilderImpl() {
    }
    
    private String name;
    private String description;
    private Supplier<T> fallback = () -> null;
    private final LinkedHashSet<String> keys = new LinkedHashSet<>() ;
    private Function<CharSequence,T> parser;
    private Variant<T> link;
}