Skip to content

Commit b23479f

Browse files
authored
Add SerializableError class for structured error serialization (#263)
2 parents e4daf28 + c1742f9 commit b23479f

3 files changed

Lines changed: 95 additions & 1 deletion

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
77
javaVersion=25
88
mcVersion=1.21.11
99
group=dev.slne.surf
10-
version=1.21.11-2.70.3
10+
version=1.21.11-2.71.0
1111
relocationPrefix=dev.slne.surf.surfapi.libs
1212
snapshot=false

surf-api-core/surf-api-core-api/api/surf-api-core-api.api

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10633,6 +10633,43 @@ public final class dev/slne/surf/surfapi/core/api/util/ParticleFactory$Companion
1063310633
public final fun of (Lcom/github/retrooper/packetevents/protocol/particle/type/ParticleType;Lcom/github/retrooper/packetevents/util/Vector3i;Lcom/github/retrooper/packetevents/util/Vector3i;I)Lcom/github/retrooper/packetevents/protocol/particle/Particle;
1063410634
}
1063510635

10636+
public final class dev/slne/surf/surfapi/core/api/util/SerializableError {
10637+
public static final field Companion Ldev/slne/surf/surfapi/core/api/util/SerializableError$Companion;
10638+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ldev/slne/surf/surfapi/core/api/util/SerializableError;)V
10639+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ldev/slne/surf/surfapi/core/api/util/SerializableError;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
10640+
public final fun buildFakeThrowable ()Ljava/lang/Throwable;
10641+
public final fun component1 ()Ljava/lang/String;
10642+
public final fun component2 ()Ljava/lang/String;
10643+
public final fun component3 ()Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10644+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ldev/slne/surf/surfapi/core/api/util/SerializableError;)Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10645+
public static synthetic fun copy$default (Ldev/slne/surf/surfapi/core/api/util/SerializableError;Ljava/lang/String;Ljava/lang/String;Ldev/slne/surf/surfapi/core/api/util/SerializableError;ILjava/lang/Object;)Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10646+
public fun equals (Ljava/lang/Object;)Z
10647+
public final fun getCause ()Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10648+
public final fun getMessage ()Ljava/lang/String;
10649+
public final fun getType ()Ljava/lang/String;
10650+
public fun hashCode ()I
10651+
public fun toString ()Ljava/lang/String;
10652+
}
10653+
10654+
public final synthetic class dev/slne/surf/surfapi/core/api/util/SerializableError$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
10655+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/util/SerializableError$$serializer;
10656+
public final fun childSerializers ()[Lkotlinx/serialization/KSerializer;
10657+
public final fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10658+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
10659+
public final fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
10660+
public final fun serialize (Lkotlinx/serialization/encoding/Encoder;Ldev/slne/surf/surfapi/core/api/util/SerializableError;)V
10661+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
10662+
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
10663+
}
10664+
10665+
public final class dev/slne/surf/surfapi/core/api/util/SerializableError$Companion {
10666+
public final fun serializer ()Lkotlinx/serialization/KSerializer;
10667+
}
10668+
10669+
public final class dev/slne/surf/surfapi/core/api/util/SerializableErrorKt {
10670+
public static final fun toSerializableError (Ljava/lang/Throwable;)Ldev/slne/surf/surfapi/core/api/util/SerializableError;
10671+
}
10672+
1063610673
public abstract class dev/slne/surf/surfapi/core/api/util/SurfTypeParameterMatcher {
1063710674
public static final field Companion Ldev/slne/surf/surfapi/core/api/util/SurfTypeParameterMatcher$Companion;
1063810675
public fun <init> ()V
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package dev.slne.surf.surfapi.core.api.util
2+
3+
import kotlinx.serialization.Serializable
4+
5+
/**
6+
* Represents an error in a serializable structure, which can encapsulate information about
7+
* the type, an optional message, and an optional nested cause.
8+
*
9+
* This class is primarily used for the structured serialization of error information and offers
10+
* the ability to generate a throwable representation of the error.
11+
*
12+
* @property type The type or category of the error, describing the nature of the issue.
13+
* @property message An optional detailed message providing more context about the error.
14+
* @property cause An optional nested instance of `SerializableError` representing the underlying cause of the error.
15+
*/
16+
@Serializable
17+
data class SerializableError(
18+
val type: String,
19+
val message: String? = null,
20+
val cause: SerializableError? = null
21+
) {
22+
23+
/**
24+
* Constructs a Throwable representation of the SerializableError instance.
25+
* The resulting Throwable includes the error type as its primary message, optionally followed
26+
* by the detailed message if provided. If the error has a nested cause, it recursively builds
27+
* a Throwable for the cause as well.
28+
*
29+
* @return A Throwable instance representing the SerializableError, including its type,
30+
* optional message, and optional cause.
31+
*/
32+
fun buildFakeThrowable(): Throwable {
33+
val throwableMessage = buildString {
34+
append(type)
35+
if (!message.isNullOrBlank()) {
36+
append(": ")
37+
append(message)
38+
}
39+
}
40+
41+
return RuntimeException(throwableMessage, cause?.buildFakeThrowable())
42+
}
43+
}
44+
45+
/**
46+
* Converts a `Throwable` instance into a `SerializableError` representation.
47+
* This allows for structured serialization of exception details, including the type,
48+
* message, and nested causes of the original `Throwable`.
49+
*
50+
* @return A `SerializableError` containing the type of the `Throwable`, its message,
51+
* and recursively serialized causes (if any).
52+
*/
53+
fun Throwable.toSerializableError(): SerializableError = SerializableError(
54+
type = this::class.qualifiedName ?: this::class.simpleName ?: "UnknownThrowable",
55+
message = message,
56+
cause = cause?.toSerializableError()
57+
)

0 commit comments

Comments
 (0)