package com.supaham.commons.bukkit.commands;
import static com.google.common.base.Preconditions.checkNotNull;
import com.sk89q.intake.argument.ArgumentException;
import com.sk89q.intake.argument.CommandArgs;
import com.sk89q.intake.parametric.AbstractModule;
import com.sk89q.intake.parametric.IllegalParameterException;
import com.sk89q.intake.parametric.Provider;
import com.sk89q.intake.parametric.ProvisionException;
import com.supaham.commons.bukkit.serializers.MaterialDataSerializer;
import com.supaham.commons.bukkit.utils.SerializationUtils;
import org.bukkit.Material;
import org.bukkit.material.MaterialData;
import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
/**
* @since 0.1
*/
public class CommonProviders extends AbstractModule {
protected static <T> T _checkNotNull(T object, String message) throws IllegalParameterException {
if (object == null) {
throw new IllegalParameterException(message);
}
return object;
}
@Override protected void configure() {
bind(MaterialData.class).toProvider(new MaterialDataProvider());
}
private static final class MaterialDataProvider implements Provider<MaterialData> {
@Override public boolean isProvided() {
return false;
}
@Nullable @Override public MaterialData get(CommandArgs arguments, List<? extends Annotation> modifiers)
throws ArgumentException, ProvisionException {
String input = _checkNotNull(arguments.next(), "Please specify a material data.");
MaterialData serializer =
SerializationUtils.deserializeWith(input, MaterialDataSerializer.class);
return _checkNotNull(serializer, "'" + input + "' is not a valid arena.");
}
@Override public List<String> getSuggestions(String prefix) {
if(prefix.contains(":")) {
String uppercase = prefix.toLowerCase();
return Arrays.stream(Material.values())
.filter(material -> material.name().startsWith(uppercase))
.map(Enum::name)
.collect(Collectors.toList());
} else {
return Collections.emptyList();
}
}
}
}