Skip to content

Commit afed8ca

Browse files
authored
GH-17 Add okaeri serializer and test for it. (#30)
* Add okaeri serializer and test for it. * Follow DMK Feedback. * Simplify code, update to new multification version. * Add okaeri serializer test.
1 parent d844e92 commit afed8ca

File tree

9 files changed

+528
-4
lines changed

9 files changed

+528
-4
lines changed

buildSrc/src/main/kotlin/multification-repositories.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ repositories {
99
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // spigot
1010
maven("https://repo.panda-lang.org/releases/") // expressible
1111
maven("https://repo.stellardrift.ca/repository/snapshots/")
12+
maven("https://storehouse.okaeri.eu/repository/maven-public/") // okaeri configs
1213
}

multification-cdn/src/com/eternalcode/multification/cdn/MultificationNoticeCdnComposer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.eternalcode.multification.notice.NoticeKey;
88
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
99
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
10+
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
1011
import com.eternalcode.multification.notice.resolver.chat.ChatContent;
1112

1213
import com.eternalcode.multification.notice.NoticePart;
@@ -97,8 +98,8 @@ private Result<Element<?>, Exception> serializeAll(SerializeContext context) {
9798
continue;
9899
}
99100

100-
if (result instanceof NoticeSerdesResult.Multi multi) {
101-
section.append(toSection(key, context.description, multi.elements()));
101+
if (result instanceof Multiple multiple) {
102+
section.append(toSection(key, context.description, multiple.elements()));
102103
continue;
103104
}
104105

multification-core/src/com/eternalcode/multification/notice/resolver/NoticeSerdesResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public List<String> anyElements() {
2525
}
2626
}
2727

28-
record Multi(List<String> elements) implements NoticeSerdesResult {
28+
record Multiple(List<String> elements) implements NoticeSerdesResult {
2929
@Override
3030
public List<String> anyElements() {
3131
return elements;

multification-core/src/com/eternalcode/multification/notice/resolver/chat/ChatResolver.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.eternalcode.multification.notice.NoticeKey;
44
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
5+
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
56
import com.eternalcode.multification.notice.resolver.text.TextContentResolver;
67
import java.util.List;
78
import java.util.Optional;
@@ -50,7 +51,7 @@ public NoticeSerdesResult serialize(ChatContent content) {
5051
return new NoticeSerdesResult.Single(messages.get(0));
5152
}
5253

53-
return new NoticeSerdesResult.Multi(messages);
54+
return new Multiple(messages);
5455
}
5556

5657
@Override

multification-okaeri/build.gradle.kts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
plugins {
2+
`multification-java`
3+
`multification-java-17`
4+
`multification-java-unit-test`
5+
`multification-repositories`
6+
`multification-publish`
7+
}
8+
9+
dependencies {
10+
api(project(":multification-core"))
11+
12+
// okaeri configs
13+
val okaeriConfigsVersion = "5.0.0-beta.5"
14+
api("eu.okaeri:okaeri-configs-yaml-snakeyaml:${okaeriConfigsVersion}")
15+
api("eu.okaeri:okaeri-configs-serdes-commons:${okaeriConfigsVersion}")
16+
17+
testImplementation(project(":multification-bukkit"))
18+
testImplementation("org.spigotmc:spigot-api:${Versions.SPIGOT_API}")
19+
testImplementation("net.kyori:adventure-api:${Versions.ADVENTURE_API}")
20+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.eternalcode.multification.okaeri;
2+
3+
import com.eternalcode.multification.notice.Notice;
4+
import com.eternalcode.multification.notice.Notice.Builder;
5+
import com.eternalcode.multification.notice.NoticeKey;
6+
import com.eternalcode.multification.notice.NoticePart;
7+
import com.eternalcode.multification.notice.resolver.NoticeContent;
8+
import com.eternalcode.multification.notice.resolver.NoticeDeserializeResult;
9+
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
10+
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
11+
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
12+
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Single;
13+
import com.eternalcode.multification.notice.resolver.chat.ChatContent;
14+
import eu.okaeri.configs.schema.GenericsDeclaration;
15+
import eu.okaeri.configs.serdes.DeserializationData;
16+
import eu.okaeri.configs.serdes.ObjectSerializer;
17+
import eu.okaeri.configs.serdes.SerializationData;
18+
import java.util.Collections;
19+
import java.util.List;
20+
import java.util.Set;
21+
import org.jetbrains.annotations.NotNull;
22+
23+
public class MultificationNoticeSerializer implements ObjectSerializer<Notice> {
24+
25+
private static final int SINGLE_SERIALIZE_DESERIALIZE_PART = 1;
26+
27+
private final NoticeResolverRegistry noticeRegistry;
28+
29+
public MultificationNoticeSerializer(NoticeResolverRegistry noticeRegistry) {
30+
this.noticeRegistry = noticeRegistry;
31+
}
32+
33+
@Override
34+
public boolean supports(@NotNull Class<? super Notice> type) {
35+
return Notice.class.isAssignableFrom(type);
36+
}
37+
38+
@Override
39+
public void serialize(Notice notice, @NotNull SerializationData data, @NotNull GenericsDeclaration generics) {
40+
List<NoticePart<?>> parts = notice.parts();
41+
42+
boolean isChatBeautifulSerialized = trySerializeChatBeautiful(data, notice);
43+
44+
if (isChatBeautifulSerialized) {
45+
return;
46+
}
47+
48+
for (NoticePart<?> part : parts) {
49+
NoticeSerdesResult result = this.noticeRegistry.serialize(part);
50+
51+
if (result instanceof NoticeSerdesResult.Single single) {
52+
data.add(part.noticeKey().key(), single.element());
53+
continue;
54+
}
55+
56+
if (result instanceof Multiple multiple) {
57+
data.add(part.noticeKey().key(), multiple.elements());
58+
}
59+
}
60+
}
61+
62+
@Override
63+
public Notice deserialize(DeserializationData data, @NotNull GenericsDeclaration generics) {
64+
Builder builder = Notice.builder();
65+
66+
if (data.isValue()) {
67+
Object value = data.getValueRaw();
68+
69+
if (value instanceof String stringValue) {
70+
List<String> messages = Collections.singletonList(stringValue);
71+
builder.withPart(NoticeKey.CHAT, new ChatContent(messages));
72+
}
73+
74+
if (value instanceof List) {
75+
List<String> messages = data.getValueAsList(String.class);
76+
builder.withPart(NoticeKey.CHAT, new ChatContent(messages));
77+
}
78+
79+
return builder.build();
80+
}
81+
82+
Set<String> keys = data.asMap().keySet();
83+
84+
for (String key : keys) {
85+
Object value = data.getRaw(key);
86+
87+
if (value instanceof String stringValue) {
88+
NoticeDeserializeResult<?> noticeResult = this.noticeRegistry.deserialize(key, new Single(stringValue))
89+
.orElseThrow(() -> new UnsupportedOperationException(
90+
"Unsupported notice key: " + key + " with value: " + stringValue));
91+
92+
this.withPart(builder, noticeResult);
93+
continue;
94+
}
95+
96+
if (value instanceof List) {
97+
List<String> messages = data.getAsList(key, String.class);
98+
99+
NoticeDeserializeResult<?> noticeResult = this.noticeRegistry.deserialize(key, new Multiple(messages))
100+
.orElseThrow(() -> new UnsupportedOperationException(
101+
"Unsupported notice key: " + key + " with values: " + messages));
102+
103+
this.withPart(builder, noticeResult);
104+
continue;
105+
}
106+
107+
throw new UnsupportedOperationException(
108+
"Unsupported notice type: " + value.getClass() + " for key: " + key);
109+
}
110+
111+
return builder.build();
112+
}
113+
114+
private <T extends NoticeContent> void withPart(Builder builder, NoticeDeserializeResult<T> noticeResult) {
115+
builder.withPart(noticeResult.noticeKey(), noticeResult.content());
116+
}
117+
118+
private static boolean trySerializeChatBeautiful(SerializationData data, Notice notice) {
119+
List<NoticePart<?>> parts = notice.parts();
120+
121+
if (parts.size() != 1) {
122+
return false;
123+
}
124+
125+
NoticePart<?> part = parts.get(0);
126+
127+
if (part.noticeKey() != NoticeKey.CHAT) {
128+
return false;
129+
}
130+
131+
ChatContent chat = (ChatContent) part.content();
132+
List<String> messages = chat.contents();
133+
134+
if (messages.size() == SINGLE_SERIALIZE_DESERIALIZE_PART) {
135+
data.setValue(messages.get(0));
136+
return true;
137+
}
138+
139+
data.setValue(messages);
140+
return true;
141+
}
142+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.eternalcode.multification.okaeri;
2+
import com.eternalcode.multification.Multification;
3+
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
4+
import eu.okaeri.configs.serdes.OkaeriSerdesPack;
5+
import eu.okaeri.configs.serdes.SerdesRegistry;
6+
import org.jetbrains.annotations.ApiStatus.Experimental;
7+
import org.jetbrains.annotations.NotNull;
8+
9+
public class MultificationSerdesPack implements OkaeriSerdesPack {
10+
11+
private final NoticeResolverRegistry noticeRegistry;
12+
13+
public MultificationSerdesPack(NoticeResolverRegistry noticeRegistry) {
14+
this.noticeRegistry = noticeRegistry;
15+
}
16+
17+
public MultificationSerdesPack(Multification<?, ?> multification) {
18+
this.noticeRegistry = multification.getNoticeRegistry();
19+
}
20+
21+
@Override
22+
public void register(@NotNull SerdesRegistry registry) {
23+
registry.register(new MultificationNoticeSerializer(this.noticeRegistry));
24+
}
25+
}

0 commit comments

Comments
 (0)