Add sender to compound argument mappers

This commit is contained in:
broccolai 2020-10-06 07:36:15 +01:00 committed by Alexander Söderberg
parent aaa6386ca3
commit caf1cc5b39
5 changed files with 23 additions and 19 deletions

View file

@ -48,8 +48,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.BiFunction;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
/** /**
* A command consists out of a chain of {@link CommandArgument command arguments}. * A command consists out of a chain of {@link CommandArgument command arguments}.
@ -495,7 +495,7 @@ public class Command<C> {
final @NonNull TypeToken<O> outputType, final @NonNull TypeToken<O> outputType,
final @NonNull Pair<String, String> names, final @NonNull Pair<String, String> names,
final @NonNull Pair<Class<U>, Class<V>> parserPair, final @NonNull Pair<Class<U>, Class<V>> parserPair,
final @NonNull Function<Pair<U, V>, O> mapper, final @NonNull BiFunction<C, Pair<U, V>, O> mapper,
final @NonNull Description description) { final @NonNull Description description) {
if (this.commandManager == null) { if (this.commandManager == null) {
throw new IllegalStateException("This cannot be called from a command that has no command manager attached"); throw new IllegalStateException("This cannot be called from a command that has no command manager attached");
@ -559,7 +559,7 @@ public class Command<C> {
final @NonNull Triplet<String, String, String> names, final @NonNull Triplet<String, String, String> names,
final @NonNull Triplet<Class<U>, Class<V>, final @NonNull Triplet<Class<U>, Class<V>,
Class<W>> parserTriplet, Class<W>> parserTriplet,
final @NonNull Function<Triplet<U, V, W>, O> mapper, final @NonNull BiFunction<C, Triplet<U, V, W>, O> mapper,
final @NonNull Description description) { final @NonNull Description description) {
if (this.commandManager == null) { if (this.commandManager == null) {
throw new IllegalStateException("This cannot be called from a command that has no command manager attached"); throw new IllegalStateException("This cannot be called from a command that has no command manager attached");

View file

@ -31,7 +31,7 @@ import cloud.commandframework.types.tuples.Pair;
import io.leangen.geantyref.TypeToken; import io.leangen.geantyref.TypeToken;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.function.Function; import java.util.function.BiFunction;
/** /**
* A compound argument consisting of two inner arguments * A compound argument consisting of two inner arguments
@ -59,7 +59,7 @@ public class ArgumentPair<C, U, V, O> extends CompoundArgument<Pair<U, V>, C, O>
final @NonNull Pair<@NonNull String, @NonNull String> names, final @NonNull Pair<@NonNull String, @NonNull String> names,
final @NonNull Pair<@NonNull Class<U>, @NonNull Class<V>> types, final @NonNull Pair<@NonNull Class<U>, @NonNull Class<V>> types,
final @NonNull Pair<@NonNull ArgumentParser<C, U>, @NonNull ArgumentParser<C, V>> parserPair, final @NonNull Pair<@NonNull ArgumentParser<C, U>, @NonNull ArgumentParser<C, V>> parserPair,
final @NonNull Function<@NonNull Pair<@NonNull U, @NonNull V>, @NonNull O> mapper, final @NonNull BiFunction<@NonNull C, @NonNull Pair<@NonNull U, @NonNull V>, @NonNull O> mapper,
final @NonNull TypeToken<O> valueType) { final @NonNull TypeToken<O> valueType) {
super(required, name, names, parserPair, types, mapper, o -> Pair.of((U) o[0], (V) o[1]), valueType); super(required, name, names, parserPair, types, mapper, o -> Pair.of((U) o[0], (V) o[1]), valueType);
} }
@ -129,7 +129,7 @@ public class ArgumentPair<C, U, V, O> extends CompoundArgument<Pair<U, V>, C, O>
this.names, this.names,
this.types, this.types,
this.parserPair, this.parserPair,
Function.identity(), (sender, pair) -> pair,
new TypeToken<Pair<U, V>>() { new TypeToken<Pair<U, V>>() {
}); });
} }
@ -143,7 +143,7 @@ public class ArgumentPair<C, U, V, O> extends CompoundArgument<Pair<U, V>, C, O>
* @return Created pair * @return Created pair
*/ */
public <O> @NonNull ArgumentPair<C, U, V, O> withMapper(final @NonNull TypeToken<O> clazz, public <O> @NonNull ArgumentPair<C, U, V, O> withMapper(final @NonNull TypeToken<O> clazz,
final @NonNull Function<@NonNull Pair<@NonNull U, final @NonNull BiFunction<@NonNull C, @NonNull Pair<@NonNull U,
@NonNull V>, @NonNull O> mapper) { @NonNull V>, @NonNull O> mapper) {
return new ArgumentPair<C, U, V, O>(this.required, this.name, this.names, this.types, this.parserPair, mapper, clazz); return new ArgumentPair<C, U, V, O>(this.required, this.name, this.names, this.types, this.parserPair, mapper, clazz);
} }
@ -158,7 +158,7 @@ public class ArgumentPair<C, U, V, O> extends CompoundArgument<Pair<U, V>, C, O>
*/ */
public <O> @NonNull ArgumentPair<@NonNull C, @NonNull U, @NonNull V, @NonNull O> withMapper( public <O> @NonNull ArgumentPair<@NonNull C, @NonNull U, @NonNull V, @NonNull O> withMapper(
final @NonNull Class<O> clazz, final @NonNull Class<O> clazz,
final @NonNull Function<@NonNull Pair<@NonNull U, @NonNull V>, @NonNull O> mapper) { final @NonNull BiFunction<@NonNull C, @NonNull Pair<@NonNull U, @NonNull V>, @NonNull O> mapper) {
return this.withMapper(TypeToken.get(clazz), mapper); return this.withMapper(TypeToken.get(clazz), mapper);
} }

View file

@ -31,7 +31,7 @@ import cloud.commandframework.types.tuples.Triplet;
import io.leangen.geantyref.TypeToken; import io.leangen.geantyref.TypeToken;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.function.Function; import java.util.function.BiFunction;
/** /**
* A compound argument consisting of three inner arguments * A compound argument consisting of three inner arguments
@ -61,7 +61,8 @@ public class ArgumentTriplet<C, U, V, W, O> extends CompoundArgument<Triplet<U,
final @NonNull Triplet<@NonNull Class<U>, @NonNull Class<V>, @NonNull Class<W>> types, final @NonNull Triplet<@NonNull Class<U>, @NonNull Class<V>, @NonNull Class<W>> types,
final @NonNull Triplet<@NonNull ArgumentParser<C, U>, @NonNull ArgumentParser<C, V>, final @NonNull Triplet<@NonNull ArgumentParser<C, U>, @NonNull ArgumentParser<C, V>,
@NonNull ArgumentParser<C, W>> parserTriplet, @NonNull ArgumentParser<C, W>> parserTriplet,
final @NonNull Function<@NonNull Triplet<U, @NonNull V, @NonNull W>, @NonNull O> mapper, final @NonNull BiFunction<@NonNull C,
@NonNull Triplet<U, @NonNull V, @NonNull W>, @NonNull O> mapper,
final @NonNull TypeToken<O> valueType) { final @NonNull TypeToken<O> valueType) {
super(required, name, names, parserTriplet, types, mapper, o -> Triplet.of((U) o[0], (V) o[1], (W) o[2]), valueType); super(required, name, names, parserTriplet, types, mapper, o -> Triplet.of((U) o[0], (V) o[1], (W) o[2]), valueType);
} }
@ -140,7 +141,7 @@ public class ArgumentTriplet<C, U, V, W, O> extends CompoundArgument<Triplet<U,
this.names, this.names,
this.types, this.types,
this.parserTriplet, this.parserTriplet,
Function.identity(), (sender, triplet) -> triplet,
new TypeToken<Triplet<U, V, W>>() { new TypeToken<Triplet<U, V, W>>() {
}); });
} }
@ -155,7 +156,7 @@ public class ArgumentTriplet<C, U, V, W, O> extends CompoundArgument<Triplet<U,
*/ */
public <O> @NonNull ArgumentTriplet<@NonNull C, @NonNull U, @NonNull V, public <O> @NonNull ArgumentTriplet<@NonNull C, @NonNull U, @NonNull V,
@NonNull W, @NonNull O> withMapper(final @NonNull TypeToken<O> clazz, @NonNull W, @NonNull O> withMapper(final @NonNull TypeToken<O> clazz,
final @NonNull Function<@NonNull Triplet<@NonNull U, final @NonNull BiFunction<@NonNull C, @NonNull Triplet<@NonNull U,
@NonNull V, @NonNull W>, @NonNull O> mapper) { @NonNull V, @NonNull W>, @NonNull O> mapper) {
return new ArgumentTriplet<>(this.required, this.name, this.names, this.types, this.parserTriplet, mapper, clazz); return new ArgumentTriplet<>(this.required, this.name, this.names, this.types, this.parserTriplet, mapper, clazz);
} }
@ -169,8 +170,9 @@ public class ArgumentTriplet<C, U, V, W, O> extends CompoundArgument<Triplet<U,
* @return Created triplet * @return Created triplet
*/ */
public <O> @NonNull ArgumentTriplet<C, U, V, W, O> withMapper(final @NonNull Class<O> clazz, public <O> @NonNull ArgumentTriplet<C, U, V, W, O> withMapper(final @NonNull Class<O> clazz,
final @NonNull Function<@NonNull Triplet<@NonNull U, final @NonNull BiFunction<@NonNull C,
@NonNull V, @NonNull W>, @NonNull O> mapper) { @NonNull Triplet<@NonNull U, @NonNull V,
@NonNull W>, @NonNull O> mapper) {
return new ArgumentTriplet<>(this.required, this.name, this.names, this.types, return new ArgumentTriplet<>(this.required, this.name, this.names, this.types,
this.parserTriplet, mapper, TypeToken.get(clazz)); this.parserTriplet, mapper, TypeToken.get(clazz));
} }

View file

@ -33,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.function.BiFunction;
import java.util.function.Function; import java.util.function.Function;
/** /**
@ -53,7 +54,7 @@ public class CompoundArgument<T extends Tuple, C, O> extends CommandArgument<C,
final @NonNull Tuple names, final @NonNull Tuple names,
final @NonNull Tuple parserTuple, final @NonNull Tuple parserTuple,
final @NonNull Tuple types, final @NonNull Tuple types,
final @NonNull Function<@NonNull T, @NonNull O> mapper, final @NonNull BiFunction<@NonNull C, @NonNull T, @NonNull O> mapper,
final @NonNull Function<@NonNull Object[], @NonNull T> tupleFactory, final @NonNull Function<@NonNull Object[], @NonNull T> tupleFactory,
final @NonNull TypeToken<O> valueType) { final @NonNull TypeToken<O> valueType) {
super(required, super(required,
@ -98,11 +99,11 @@ public class CompoundArgument<T extends Tuple, C, O> extends CommandArgument<C,
private static final class CompoundParser<T extends Tuple, C, O> implements ArgumentParser<C, O> { private static final class CompoundParser<T extends Tuple, C, O> implements ArgumentParser<C, O> {
private final Object[] parsers; private final Object[] parsers;
private final Function<T, O> mapper; private final BiFunction<C, T, O> mapper;
private final Function<Object[], T> tupleFactory; private final Function<Object[], T> tupleFactory;
private CompoundParser(final @NonNull Tuple parserTuple, private CompoundParser(final @NonNull Tuple parserTuple,
final @NonNull Function<@NonNull T, @NonNull O> mapper, final @NonNull BiFunction<@NonNull C, @NonNull T, @NonNull O> mapper,
final @NonNull Function<@NonNull Object[], @NonNull T> tupleFactory) { final @NonNull Function<@NonNull Object[], @NonNull T> tupleFactory) {
this.parsers = parserTuple.toArray(); this.parsers = parserTuple.toArray();
this.mapper = mapper; this.mapper = mapper;
@ -128,7 +129,8 @@ public class CompoundArgument<T extends Tuple, C, O> extends CommandArgument<C,
* Now check if the mapper threw any exceptions * Now check if the mapper threw any exceptions
*/ */
try { try {
return ArgumentParseResult.success(this.mapper.apply(this.tupleFactory.apply(output))); return ArgumentParseResult.success(this.mapper.apply(commandContext.getSender(),
this.tupleFactory.apply(output)));
} catch (final Exception e) { } catch (final Exception e) {
return ArgumentParseResult.failure(e); return ArgumentParseResult.failure(e);
} }

View file

@ -96,7 +96,7 @@ class CommandTreeTest {
.argument(ArgumentPair.of(manager, "vec", Pair.of("x", "y"), .argument(ArgumentPair.of(manager, "vec", Pair.of("x", "y"),
Pair.of(Double.class, Double.class)) Pair.of(Double.class, Double.class))
.withMapper(Vector2.class, .withMapper(Vector2.class,
pair -> new Vector2(pair.getFirst(), pair.getSecond())) (sender, pair) -> new Vector2(pair.getFirst(), pair.getSecond()))
) )
.handler(c -> { .handler(c -> {
final Vector2 vector2 = c.get("vec"); final Vector2 vector2 = c.get("vec");