/* * This file is part of ComputerCraft - http://www.computercraft.info * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission. * Send enquiries to dratcliffe@gmail.com */ package dan200.computercraft.shared.command.arguments; import com.mojang.brigadier.Message; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.Function; public abstract class ChoiceArgumentType implements ArgumentType { private final Iterable choices; private final Function name; private final Function tooltip; private final DynamicCommandExceptionType exception; protected ChoiceArgumentType( Iterable choices, Function name, Function tooltip, DynamicCommandExceptionType exception ) { this.choices = choices; this.name = name; this.tooltip = tooltip; this.exception = exception; } @Override public T parse( StringReader reader ) throws CommandSyntaxException { int start = reader.getCursor(); String name = reader.readUnquotedString(); for( T choice : choices ) { String choiceName = this.name.apply( choice ); if( name.equals( choiceName ) ) return choice; } reader.setCursor( start ); throw exception.createWithContext( reader, name ); } @Override public CompletableFuture listSuggestions( CommandContext context, SuggestionsBuilder builder ) { String remaining = builder.getRemaining().toLowerCase( Locale.ROOT ); for( T choice : choices ) { String name = this.name.apply( choice ); if( !name.toLowerCase( Locale.ROOT ).startsWith( remaining ) ) continue; builder.suggest( name, tooltip.apply( choice ) ); } return builder.buildFuture(); } @Override public Collection getExamples() { List items = choices instanceof Collection ? new ArrayList<>( ((Collection) choices).size() ) : new ArrayList<>(); for( T choice : choices ) items.add( name.apply( choice ) ); items.sort( Comparator.naturalOrder() ); return items; } }