Skip to content

Commit

Permalink
♻️ Refactor deserialization error message for EmailAddress (#635)
Browse files Browse the repository at this point in the history
  • Loading branch information
LVMVRQUXL committed Apr 17, 2024
1 parent 8173240 commit 893fed0
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ internal class DeserializationError(
override val message: String
get() {
val serialName: String = this.deserializer.descriptor.serialName
val reasonMessage: String = this.reason?.message ?: ""
return "Unable to deserialize '$serialName' from ${decodedValue}." +
reasonMessage
val errorMessage = "Unable to deserialize \"$serialName\" from " +
"\"${decodedValue}\"."
return this.reason?.let { "$errorMessage ${it.message}" }
?: errorMessage
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotools.types.experimental.ExperimentalKotoolsTypesApi
import org.kotools.types.EmailAddress
import org.kotools.types.internal.InvalidEmailAddressError

@OptIn(ExperimentalKotoolsTypesApi::class)
internal object EmailAddressAsStringSerializer : KSerializer<EmailAddress> {
Expand All @@ -26,7 +27,10 @@ internal object EmailAddressAsStringSerializer : KSerializer<EmailAddress> {
val decodedValue: String = decoder.decodeString()
val address: EmailAddress? = EmailAddress.fromStringOrNull(decodedValue)
if (address != null) return address
val error = DeserializationError(deserializer = this, decodedValue)
val reason =
InvalidEmailAddressError(decodedValue, EmailAddress.PATTERN)
val error =
DeserializationError(deserializer = this, decodedValue, reason)
throw SerializationException(error.message)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotools.types.experimental.ExperimentalKotoolsTypesApi
import org.kotools.types.EmailAddress
import org.kotools.types.internal.InvalidEmailAddressError
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
Expand Down Expand Up @@ -75,15 +76,20 @@ class EmailAddressAsStringSerializerTest {
fun deserialization_should_fail_with_a_String_having_whitespaces_in_domain_second_label(): Unit =
this.failingDeserialization(value = "contact@kotools. or g ")

@OptIn(ExperimentalKotoolsTypesApi::class)
private fun failingDeserialization(value: String) {
val encoded: String = Json.encodeToString(value)
val deserializer = EmailAddressAsStringSerializer
val exception: SerializationException = assertFailsWith {
Json.decodeFromString(deserializer, encoded)
}
val actual: String? = exception.message
val expected: String =
DeserializationError(deserializer, decodedValue = value).message
val reason = InvalidEmailAddressError(value, EmailAddress.PATTERN)
val expected: String = DeserializationError(
deserializer,
decodedValue = value,
reason
).message
assertEquals(expected, actual)
}
}

0 comments on commit 893fed0

Please sign in to comment.