Skip to content

Commit ac56520

Browse files
author
burdo
committed
fix internal problems with databinding mechanisms
1 parent e04c42e commit ac56520

6 files changed

Lines changed: 58 additions & 17 deletions

File tree

src/main/java/org/comroid/api/data/seri/DataNode.java

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.ArrayList;
3939
import java.util.Arrays;
4040
import java.util.Collection;
41+
import java.util.HashMap;
4142
import java.util.List;
4243
import java.util.Map;
4344
import java.util.Objects;
@@ -305,11 +306,13 @@ default UUID asUUID(UUID fallback) {
305306

306307
@Override
307308
default <R> Wrap<R> as(final Class<R> type) {
308-
return Specifiable.super.as(type)
309-
.orRef(() -> Wrap.of(ValueType.of(type))
310-
.flatMap(StandardValueType.class)
311-
.map(svt -> Polyfill.<R>uncheckedCast(svt.parse(asString())))
312-
.or(() -> Activator.get(type).createInstance(this)));
309+
return Specifiable.super.as(type).orRef(() -> {
310+
var valueType = ValueType.of(type);
311+
return Wrap.of(valueType)
312+
.flatMap(StandardValueType.class)
313+
.map(svt -> Polyfill.<R>uncheckedCast(svt.parse(asString())))
314+
.orRef(() -> as(valueType).castRef());
315+
});
313316
}
314317

315318
@Nullable
@@ -356,14 +359,35 @@ public <T> DataNode set(String key, T value) {
356359
return val;
357360
}
358361

362+
@Override
363+
public <R> @Nullable R convert(Class<? super R> target) {
364+
if (Map.class.isAssignableFrom(target) && !Object.class.isAssignableFrom(target)) {
365+
//noinspection unchecked
366+
return (R) toMap();
367+
}
368+
return Wrap.of(Activator.get(target).createInstance(this)).cast();
369+
}
370+
371+
@Override
372+
public <T> Wrap<T> as(ValueType<T> type) {
373+
var convert = convert(type.getTargetClass());
374+
return Wrap.of(convert);
375+
}
376+
359377
@Override
360378
public Stream<DataNode.Entry> properties() {
361379
return entrySet().stream().map(e -> new DataNode.Entry(e.getKey(), e.getValue()));
362380
}
363381

364-
@Override
365-
public <R> @Nullable R convert(Class<? super R> target) {
366-
return Wrap.of(Activator.get(target).createInstance(this)).cast();
382+
public @NotNull Map<String, java.lang.Object> toMap() {
383+
var out = new HashMap<String, java.lang.Object>();
384+
map.forEach((k, v) -> out.put(k, switch (v) {
385+
case Object obj -> obj.toMap();
386+
case Array arr -> arr.toList();
387+
case Value<?> val -> val.getValue();
388+
default -> v;
389+
}));
390+
return out;
367391
}
368392
}
369393

@@ -380,7 +404,7 @@ public <T> DataNode append(T value) {
380404
@Override
381405
@SneakyThrows
382406
public <R> Wrap<R> as(ValueType<R> type) {
383-
if (!type.isArray()) throw new IllegalArgumentException("Need array type");
407+
if (!type.isArray()) throw new IllegalArgumentException("Need array type; got " + type);
384408
var componentType = type.getTargetClass().getComponentType();
385409
var array = (java.lang.Object[]) java.lang.reflect.Array.newInstance(componentType, size());
386410
var me = asArray();
@@ -398,6 +422,17 @@ public Stream<Entry> properties() {
398422
}
399423
return ls.stream();
400424
}
425+
426+
public @NotNull List<java.lang.Object> toList() {
427+
var out = new ArrayList<>();
428+
list.forEach(v -> out.add(switch (v) {
429+
case Object obj -> obj.toMap();
430+
case Array arr -> arr.toList();
431+
case Value<?> val -> val.getValue();
432+
default -> v;
433+
}));
434+
return out;
435+
}
401436
}
402437

403438
@lombok.Value

src/main/java/org/comroid/api/func/ext/Wrap.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,10 @@ default <O> Wrap<O> flatMap(final @NotNull Class<O> type) {
363363
}
364364

365365
default <O> Wrap<O> flatMap(final @NotNull Function<? super T, Supplier<? extends O>> func) {
366-
return ifPresentMapOrElseGet(func, () -> null)::get;
366+
return () -> {
367+
Supplier<? extends O> supplier = ifPresentMapOrElseGet(func, () -> null);
368+
return supplier == null ? null : supplier.get();
369+
};
367370
}
368371

369372
@Value

src/main/java/org/comroid/api/java/Activator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public T createInstance(DataNode data) {
5252
.stream()
5353
.sorted(Comparator.<DataStructure<T>.Constructor>comparingInt(ctor -> ctor.getArgs().size())
5454
.reversed())
55-
.filter(ctor -> ctor.getArgs().size() <= data.size())
55+
//.filter(ctor -> ctor.getArgs().size() <= data.size())
5656
.filter(ctor -> ctor.getArgs()
5757
.stream()
5858
.flatMap(param -> Annotations.aliases(param).stream())
@@ -71,7 +71,7 @@ public T createInstance(DataNode data) {
7171
.findAny()
7272
.map(obj::get))
7373
.flatMap(it -> it.as(ValueType.of(param.getType())))
74-
.orElseThrow();
74+
.orElse(null);
7575
}
7676

7777
final var it = ctor.getCtor().invokeRethrow(args);

src/main/java/org/comroid/api/net/luckperms/component/GroupsApi.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ public CompletableFuture<Collection<String>> getIDs() {
3131

3232
@Override
3333
public CompletableFuture<GroupData> get(String name) {
34-
return getLpApi().get("/group/" + name).thenApply(data -> data.as(GroupData.class).assertion());
34+
return getLpApi().get("/group/" + name)
35+
.thenApply(data -> data.as(GroupData.class).orElseThrow(() -> new RuntimeException()));
3536
}
3637

3738
@lombok.Builder(builderMethodName = "search", buildMethodName = "execute", builderClassName = "SearchQuery")
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.comroid.api.net.luckperms.model.group;
22

3+
import org.comroid.api.net.luckperms.model.dto.Metadata;
34
import org.comroid.api.net.luckperms.model.node.Node;
45
import org.jetbrains.annotations.Nullable;
56

6-
public record GroupData(String name, @Nullable String displayName, int weight, Node[] nodes) {
7-
}
7+
public record GroupData(
8+
String name, @Nullable String displayName, int weight, Node[] nodes, @Nullable Metadata metadata
9+
) {}

src/main/java/org/comroid/api/net/luckperms/model/user/UserData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
import org.comroid.api.net.luckperms.model.dto.Metadata;
44
import org.comroid.api.net.luckperms.model.node.Node;
5+
import org.jetbrains.annotations.Nullable;
56

6-
import java.util.Collection;
77
import java.util.UUID;
88

99
public record UserData(
10-
UUID uniqueId, String username, Collection<String> parentGroups, Node[] nodes, Metadata metadata
10+
UUID uniqueId, String username, String[] parentGroups, Node[] nodes, @Nullable Metadata metadata
1111
) {}

0 commit comments

Comments
 (0)