diff --git a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializer.java b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializer.java index 4af29c00e..b0262e395 100644 --- a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializer.java +++ b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializer.java @@ -1,13 +1,17 @@ package net.kyori.adventure.text.serializer; import net.kyori.adventure.text.Component; +import net.kyori.adventure.util.PlatformAPI; import net.kyori.ansi.ColorLevel; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.function.Consumer; + public interface ANSIComponentSerializer extends ComponentSerializer { static @NotNull ANSIComponentSerializer ansi() { - return ANSIComponentSerializerImpl.INSTANCE; + return ANSIComponentSerializerImpl.Instances.INSTANCE; } @NotNull String serialize(@NotNull Component component, @NotNull ColorLevel colorLevel); @@ -18,4 +22,22 @@ default Component deserialize(@NotNull String input) { throw new UnsupportedOperationException("AnsiComponentSerializer does not support deserialization"); } + /** + * A {@link ANSIComponentSerializer} service provider. + * + * @since 4.14.0 + */ + @ApiStatus.Internal + @PlatformAPI + interface Provider { + /** + * Provides a {@link ANSIComponentSerializer}. + * + * @return a {@link ANSIComponentSerializer} + * @since 4.8.0 + */ + @ApiStatus.Internal + @PlatformAPI + @NotNull ANSIComponentSerializer ansi(); + } } diff --git a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializerImpl.java b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializerImpl.java index 2d408cabc..c85dc4fc3 100644 --- a/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializerImpl.java +++ b/text-serializer-ansi/src/main/java/net/kyori/adventure/text/serializer/ANSIComponentSerializerImpl.java @@ -7,6 +7,7 @@ import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.util.Services; import net.kyori.ansi.ANSIComponentRenderer; import net.kyori.ansi.ColorLevel; import net.kyori.ansi.StyleOps; @@ -14,8 +15,15 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; +import java.util.Optional; + public class ANSIComponentSerializerImpl implements ANSIComponentSerializer { - static final ANSIComponentSerializer INSTANCE = new ANSIComponentSerializerImpl(); + private static final Optional SERVICE = Services.service(Provider.class); + static final class Instances { + static final ANSIComponentSerializer INSTANCE = SERVICE + .map(Provider::ansi) + .orElseGet(ANSIComponentSerializerImpl::new); + } @Override public @NotNull String serialize(@NotNull Component component) {