Skip to content

GH-17 Add okaeri serializer and test for it. #30

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Jul 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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