Skip to content

Commit 25ccaa6

Browse files
committed
parse arguments in a way valid for invocable
1 parent 1e35784 commit 25ccaa6

2 files changed

Lines changed: 40 additions & 27 deletions

File tree

src/main/java/org/comroid/commands/impl/CommandManager.java

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.comroid.api.Polyfill;
1111
import org.comroid.api.attr.Aliased;
1212
import org.comroid.api.data.seri.adp.JSON;
13-
import org.comroid.api.data.seri.type.ValueType;
1413
import org.comroid.api.func.util.Invocable;
1514
import org.comroid.api.java.Activator;
1615
import org.comroid.api.java.ReflectionHelper;
@@ -37,14 +36,11 @@
3736
import java.util.ArrayList;
3837
import java.util.Arrays;
3938
import java.util.Collection;
40-
import java.util.Comparator;
4139
import java.util.HashSet;
4240
import java.util.Map;
43-
import java.util.Objects;
4441
import java.util.Optional;
4542
import java.util.Set;
4643
import java.util.UUID;
47-
import java.util.function.Function;
4844
import java.util.stream.Collectors;
4945
import java.util.stream.Stream;
5046

@@ -188,28 +184,26 @@ public final Stream<AutoFillOption> autoComplete(
188184

189185
validatePermitted(usage, call);
190186

191-
// sort arguments
192-
var parameters = call.getParameters();
193-
var paramIndex = new int[]{ 0 };
194-
195-
// decide arg handling type
196-
var argStringSource = (hasCapability(CommandCapability.NAMED_ARGS)
197-
? (Function<String, Stream<org.comroid.commands.node.Parameter>>) key -> parameters.stream()
198-
.filter(p -> p.getName().equals(key))
199-
: (Function<String, Stream<org.comroid.commands.node.Parameter>>) $ -> parameters.stream()
200-
.sorted(Comparator.comparingInt(org.comroid.commands.node.Parameter::getIndex))
201-
.skip(paramIndex[0])).andThen(src -> src.map(usage.getArgumentStrings()::get));
202-
203-
// parse args
204-
var useArgs = parameters.stream().map(param -> {
205-
var vt = ValueType.of(param.getParam().getType());
206-
return argStringSource.apply(param.getName())
207-
.filter(Objects::nonNull)
208-
.findAny()
209-
.map(vt::parse)
210-
.or(() -> usage.getContext().stream().filter(vt.getTargetClass()::isInstance).findAny())
211-
.orElse(null);
212-
}).toArray();
187+
var adapters = call.adaptParameters();
188+
var useArgs = new Object[adapters.length];
189+
190+
for (var i = 0; i < adapters.length; i++) {
191+
var adapter = adapters[i];
192+
var commandParameter = adapter.commandParameter();
193+
194+
if (commandParameter != null) {
195+
// parse user argument
196+
var str = usage.getArgumentStrings().get(commandParameter);
197+
useArgs[i] = adapter.type().parse(str);
198+
} else {
199+
// find contextual argument
200+
useArgs[i] = usage.getContext()
201+
.stream()
202+
.filter(adapter.type().getTargetClass()::isInstance)
203+
.findAny()
204+
.orElse(null);
205+
}
206+
}
213207

214208
// execute method
215209
result = response = call.getCallable().invoke(call.getTarget(), useArgs);

src/main/java/org/comroid/commands/node/Call.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.Singular;
44
import lombok.Value;
55
import lombok.experimental.SuperBuilder;
6+
import org.comroid.api.data.seri.type.ValueType;
67
import org.comroid.api.func.ext.Wrap;
78
import org.comroid.api.func.util.Invocable;
89
import org.jetbrains.annotations.NotNull;
@@ -27,7 +28,7 @@ public String getAlternateName() {
2728
}
2829

2930
@Override
30-
public @Nullable org.comroid.commands.node.Call asCall() {
31+
public org.comroid.commands.node.Call asCall() {
3132
return this;
3233
}
3334

@@ -40,4 +41,22 @@ public Stream<Parameter> nodes() {
4041
public Wrap<AnnotatedElement> element() {
4142
return callable::accessor;
4243
}
44+
45+
public ParameterAdapter[] adaptParameters() {
46+
var javaParameters = method.getParameters();
47+
var adapters = new ParameterAdapter[javaParameters.length];
48+
49+
for (var i = 0; i < javaParameters.length; i++) {
50+
var javaParam = javaParameters[i];
51+
var cmdParamResult = parameters.stream().filter(p -> p.getParam().equals(javaParam)).findAny();
52+
adapters[i] = new ParameterAdapter(ValueType.of(javaParam.getType()),
53+
javaParam,
54+
cmdParamResult.orElse(null));
55+
}
56+
return adapters;
57+
}
58+
59+
public record ParameterAdapter(
60+
ValueType<?> type, java.lang.reflect.Parameter javaParameter, @Nullable Parameter commandParameter
61+
) {}
4362
}

0 commit comments

Comments
 (0)