diff --git a/scalabot-meta/src/main/kotlin/serializer/Serializer.kt b/scalabot-meta/src/main/kotlin/serializer/Serializer.kt index 9899b96..9b55257 100644 --- a/scalabot-meta/src/main/kotlin/serializer/Serializer.kt +++ b/scalabot-meta/src/main/kotlin/serializer/Serializer.kt @@ -3,6 +3,7 @@ package net.lamgc.scalabot.config.serializer import com.google.gson.* import com.google.gson.reflect.TypeToken import net.lamgc.scalabot.config.* +import net.lamgc.scalabot.config.serializer.SerializeUtils.getPrimitiveValueOrThrow import org.eclipse.aether.artifact.AbstractArtifact import org.eclipse.aether.artifact.Artifact import org.eclipse.aether.artifact.DefaultArtifact @@ -81,8 +82,8 @@ object AuthenticationSerializer : JsonDeserializer { if (json !is JsonObject) { throw JsonParseException("Unsupported JSON type.") } - val username = SerializerUtils.checkJsonKey(json, "username") - val password = SerializerUtils.checkJsonKey(json, "password") + val username = json.getPrimitiveValueOrThrow("username").asString + val password = json.getPrimitiveValueOrThrow("password").asString val builder = AuthenticationBuilder() builder.addUsername(username) builder.addPassword(password) @@ -91,14 +92,14 @@ object AuthenticationSerializer : JsonDeserializer { } -private object SerializerUtils { - fun checkJsonKey(json: JsonObject, key: String): String { - if (!json.has(key)) { - throw JsonParseException("Required field does not exist: $key") - } else if (!json.get(key).isJsonPrimitive) { - throw JsonParseException("Wrong field `$key` type: ${json.get(key)::class.java}") +internal object SerializeUtils { + + fun JsonObject.getPrimitiveValueOrThrow(fieldName: String): JsonPrimitive { + val value = get(fieldName) ?: throw JsonParseException("Missing `$fieldName` field.") + if (value !is JsonPrimitive) { + throw JsonParseException("Invalid `account` field type.") } - return json.get(key).asString + return value } } @@ -114,7 +115,7 @@ object MavenRepositoryConfigSerializer is JsonObject -> { MavenRepositoryConfig( id = json.get("id")?.asString, - url = URL(SerializerUtils.checkJsonKey(json, "url")), + url = URL(json.getPrimitiveValueOrThrow("url").asString), proxy = if (json.has("proxy")) context.deserialize( json.get("proxy"), Proxy::class.java diff --git a/scalabot-meta/src/test/kotlin/serializer/SerializersKtTest.kt b/scalabot-meta/src/test/kotlin/serializer/SerializeUtilsTest.kt similarity index 95% rename from scalabot-meta/src/test/kotlin/serializer/SerializersKtTest.kt rename to scalabot-meta/src/test/kotlin/serializer/SerializeUtilsTest.kt index c5cd5dd..6029775 100644 --- a/scalabot-meta/src/test/kotlin/serializer/SerializersKtTest.kt +++ b/scalabot-meta/src/test/kotlin/serializer/SerializeUtilsTest.kt @@ -5,6 +5,7 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import net.lamgc.scalabot.config.* +import net.lamgc.scalabot.config.serializer.SerializeUtils.getPrimitiveValueOrThrow import org.eclipse.aether.artifact.Artifact import org.eclipse.aether.artifact.DefaultArtifact import org.eclipse.aether.repository.Authentication @@ -12,54 +13,39 @@ import org.eclipse.aether.repository.AuthenticationContext import org.eclipse.aether.repository.Proxy import org.intellij.lang.annotations.Language import org.junit.jupiter.api.Assertions.assertThrows -import java.lang.reflect.InvocationTargetException -import java.lang.reflect.Method import java.lang.reflect.Type import java.net.URL import kotlin.test.* -internal class SerializersKtTest { - - private val instance: Any - private val method: Method - - init { - val clazz = Class.forName("net.lamgc.scalabot.config.serializer.SerializerUtils") - method = clazz.getDeclaredMethod("checkJsonKey", JsonObject::class.java, String::class.java) - method.isAccessible = true - instance = clazz.getDeclaredField("INSTANCE").apply { - isAccessible = true - }.get(null) - } - - private fun invoke(json: JsonObject, key: String): String { - try { - return method.invoke(instance, json, key) as String - } catch (e: InvocationTargetException) { - throw e.targetException - } - } +internal class SerializeUtilsTest { @Test - fun `Json key checker test`() { + fun `getPrimitiveValueOrThrow test`() { assertThrows(JsonParseException::class.java) { - invoke(JsonObject(), "NOT_EXIST_KEY") - } - assertThrows(JsonParseException::class.java) { - invoke(JsonObject().apply { add("NULL_KEY", JsonNull.INSTANCE) }, "NULL_KEY") - } - assertThrows(JsonParseException::class.java) { - invoke(JsonObject().apply { add("ARRAY_KEY", JsonArray()) }, "ARRAY_KEY") - } - assertThrows(JsonParseException::class.java) { - invoke(JsonObject().apply { add("OBJECT_KEY", JsonObject()) }, "OBJECT_KEY") + JsonObject().getPrimitiveValueOrThrow("NOT_EXIST_KEY") } - val expectKey = "TEST" - val expectString = "testString" - val json = JsonObject().apply { addProperty(expectKey, expectString) } + assertThrows(JsonParseException::class.java) { + JsonObject().apply { + add("testKey", JsonArray()) + }.getPrimitiveValueOrThrow("testKey") + } + assertThrows(JsonParseException::class.java) { + JsonObject().apply { + add("testKey", JsonObject()) + }.getPrimitiveValueOrThrow("testKey") + } + assertThrows(JsonParseException::class.java) { + JsonObject().apply { + add("testKey", JsonNull.INSTANCE) + }.getPrimitiveValueOrThrow("testKey") + } - assertEquals(expectString, invoke(json, expectKey)) + val expectKey = "STRING_KEY" + val expectValue = JsonPrimitive("A STRING") + assertEquals(expectValue, JsonObject() + .apply { add(expectKey, expectValue) } + .getPrimitiveValueOrThrow(expectKey)) } }