Skip to content

Commit

Permalink
GH-17 Add okaeri serializer and test for it. (#30)
Browse files Browse the repository at this point in the history
* Add okaeri serializer and test for it.

* Follow DMK Feedback.

* Simplify code, update to new multification version.

* Add okaeri serializer test.
  • Loading branch information
vLuckyyy authored Jul 1, 2024
1 parent d844e92 commit afed8ca
Show file tree
Hide file tree
Showing 9 changed files with 528 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ repositories {
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") // spigot
maven("https://repo.panda-lang.org/releases/") // expressible
maven("https://repo.stellardrift.ca/repository/snapshots/")
maven("https://storehouse.okaeri.eu/repository/maven-public/") // okaeri configs
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.eternalcode.multification.notice.NoticeKey;
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
import com.eternalcode.multification.notice.resolver.chat.ChatContent;

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

if (result instanceof NoticeSerdesResult.Multi multi) {
section.append(toSection(key, context.description, multi.elements()));
if (result instanceof Multiple multiple) {
section.append(toSection(key, context.description, multiple.elements()));
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public List<String> anyElements() {
}
}

record Multi(List<String> elements) implements NoticeSerdesResult {
record Multiple(List<String> elements) implements NoticeSerdesResult {
@Override
public List<String> anyElements() {
return elements;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.eternalcode.multification.notice.NoticeKey;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
import com.eternalcode.multification.notice.resolver.text.TextContentResolver;
import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -50,7 +51,7 @@ public NoticeSerdesResult serialize(ChatContent content) {
return new NoticeSerdesResult.Single(messages.get(0));
}

return new NoticeSerdesResult.Multi(messages);
return new Multiple(messages);
}

@Override
Expand Down
20 changes: 20 additions & 0 deletions multification-okaeri/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
plugins {
`multification-java`
`multification-java-17`
`multification-java-unit-test`
`multification-repositories`
`multification-publish`
}

dependencies {
api(project(":multification-core"))

// okaeri configs
val okaeriConfigsVersion = "5.0.0-beta.5"
api("eu.okaeri:okaeri-configs-yaml-snakeyaml:${okaeriConfigsVersion}")
api("eu.okaeri:okaeri-configs-serdes-commons:${okaeriConfigsVersion}")

testImplementation(project(":multification-bukkit"))
testImplementation("org.spigotmc:spigot-api:${Versions.SPIGOT_API}")
testImplementation("net.kyori:adventure-api:${Versions.ADVENTURE_API}")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
package com.eternalcode.multification.okaeri;

import com.eternalcode.multification.notice.Notice;
import com.eternalcode.multification.notice.Notice.Builder;
import com.eternalcode.multification.notice.NoticeKey;
import com.eternalcode.multification.notice.NoticePart;
import com.eternalcode.multification.notice.resolver.NoticeContent;
import com.eternalcode.multification.notice.resolver.NoticeDeserializeResult;
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Multiple;
import com.eternalcode.multification.notice.resolver.NoticeSerdesResult.Single;
import com.eternalcode.multification.notice.resolver.chat.ChatContent;
import eu.okaeri.configs.schema.GenericsDeclaration;
import eu.okaeri.configs.serdes.DeserializationData;
import eu.okaeri.configs.serdes.ObjectSerializer;
import eu.okaeri.configs.serdes.SerializationData;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import org.jetbrains.annotations.NotNull;

public class MultificationNoticeSerializer implements ObjectSerializer<Notice> {

private static final int SINGLE_SERIALIZE_DESERIALIZE_PART = 1;

private final NoticeResolverRegistry noticeRegistry;

public MultificationNoticeSerializer(NoticeResolverRegistry noticeRegistry) {
this.noticeRegistry = noticeRegistry;
}

@Override
public boolean supports(@NotNull Class<? super Notice> type) {
return Notice.class.isAssignableFrom(type);
}

@Override
public void serialize(Notice notice, @NotNull SerializationData data, @NotNull GenericsDeclaration generics) {
List<NoticePart<?>> parts = notice.parts();

boolean isChatBeautifulSerialized = trySerializeChatBeautiful(data, notice);

if (isChatBeautifulSerialized) {
return;
}

for (NoticePart<?> part : parts) {
NoticeSerdesResult result = this.noticeRegistry.serialize(part);

if (result instanceof NoticeSerdesResult.Single single) {
data.add(part.noticeKey().key(), single.element());
continue;
}

if (result instanceof Multiple multiple) {
data.add(part.noticeKey().key(), multiple.elements());
}
}
}

@Override
public Notice deserialize(DeserializationData data, @NotNull GenericsDeclaration generics) {
Builder builder = Notice.builder();

if (data.isValue()) {
Object value = data.getValueRaw();

if (value instanceof String stringValue) {
List<String> messages = Collections.singletonList(stringValue);
builder.withPart(NoticeKey.CHAT, new ChatContent(messages));
}

if (value instanceof List) {
List<String> messages = data.getValueAsList(String.class);
builder.withPart(NoticeKey.CHAT, new ChatContent(messages));
}

return builder.build();
}

Set<String> keys = data.asMap().keySet();

for (String key : keys) {
Object value = data.getRaw(key);

if (value instanceof String stringValue) {
NoticeDeserializeResult<?> noticeResult = this.noticeRegistry.deserialize(key, new Single(stringValue))
.orElseThrow(() -> new UnsupportedOperationException(
"Unsupported notice key: " + key + " with value: " + stringValue));

this.withPart(builder, noticeResult);
continue;
}

if (value instanceof List) {
List<String> messages = data.getAsList(key, String.class);

NoticeDeserializeResult<?> noticeResult = this.noticeRegistry.deserialize(key, new Multiple(messages))
.orElseThrow(() -> new UnsupportedOperationException(
"Unsupported notice key: " + key + " with values: " + messages));

this.withPart(builder, noticeResult);
continue;
}

throw new UnsupportedOperationException(
"Unsupported notice type: " + value.getClass() + " for key: " + key);
}

return builder.build();
}

private <T extends NoticeContent> void withPart(Builder builder, NoticeDeserializeResult<T> noticeResult) {
builder.withPart(noticeResult.noticeKey(), noticeResult.content());
}

private static boolean trySerializeChatBeautiful(SerializationData data, Notice notice) {
List<NoticePart<?>> parts = notice.parts();

if (parts.size() != 1) {
return false;
}

NoticePart<?> part = parts.get(0);

if (part.noticeKey() != NoticeKey.CHAT) {
return false;
}

ChatContent chat = (ChatContent) part.content();
List<String> messages = chat.contents();

if (messages.size() == SINGLE_SERIALIZE_DESERIALIZE_PART) {
data.setValue(messages.get(0));
return true;
}

data.setValue(messages);
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.eternalcode.multification.okaeri;
import com.eternalcode.multification.Multification;
import com.eternalcode.multification.notice.resolver.NoticeResolverRegistry;
import eu.okaeri.configs.serdes.OkaeriSerdesPack;
import eu.okaeri.configs.serdes.SerdesRegistry;
import org.jetbrains.annotations.ApiStatus.Experimental;
import org.jetbrains.annotations.NotNull;

public class MultificationSerdesPack implements OkaeriSerdesPack {

private final NoticeResolverRegistry noticeRegistry;

public MultificationSerdesPack(NoticeResolverRegistry noticeRegistry) {
this.noticeRegistry = noticeRegistry;
}

public MultificationSerdesPack(Multification<?, ?> multification) {
this.noticeRegistry = multification.getNoticeRegistry();
}

@Override
public void register(@NotNull SerdesRegistry registry) {
registry.register(new MultificationNoticeSerializer(this.noticeRegistry));
}
}
Loading

0 comments on commit afed8ca

Please sign in to comment.