From e04ee7300c34d38958a147ff69e09ff47368c38e Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 12 Oct 2019 13:00:38 +0600 Subject: [PATCH] SauceNaoAnswer#row --- CHANGELOG.md | 4 +- README.md | 2 +- .../SauceNaoAPI/models/SauceNaoAnswer.kt | 37 +++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a1a7a0..3bf6b5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,14 @@ * Now `SauceNaoAPI` working with synchronous queue * `SauceNaoAPI` now will wait for some time when one of limits will be achieved -### 0.4.1 Managers experiments +### 0.4.1 Managers experiments and row format in answer * Add `TimeManager` - it will manage work with requests times * Add `RequestQuotaMagager` - it will manage quota for requests and call suspend if they will be over * `SauceNaoAPI` now working (almost) asynchronously +* Now `SauceNaoAnswer` have field `row` which contains `JsonObject` with +all original answer fields ## 0.3.0 diff --git a/README.md b/README.md index 298c336..91f7ff5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ It is wrapper for [SauceNAO](https://saucenao.com/) API. For now, library is in preview state. It can be fully used, but some of info can be unavailable from -wrapper classes. +wrapper classes, but now you can access them via `SauceNaoAnswer#row` field. ## Requester diff --git a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/SauceNaoAnswer.kt b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/SauceNaoAnswer.kt index 76652f3..c8e5813 100644 --- a/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/SauceNaoAnswer.kt +++ b/src/main/kotlin/com/github/insanusmokrassar/SauceNaoAPI/models/SauceNaoAnswer.kt @@ -1,9 +1,40 @@ package com.github.insanusmokrassar.SauceNaoAPI.models -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer +import kotlinx.serialization.json.* -@Serializable +@Serializable(SauceNaoAnswerSerializer::class) data class SauceNaoAnswer( val header: Header, - val results: List = emptyList() + val results: List = emptyList(), + val raw: JsonObject ) + +@Serializer(SauceNaoAnswer::class) +object SauceNaoAnswerSerializer : KSerializer { + private val resultsSerializer = ArrayListSerializer(Result.serializer()) + private const val headerField = "header" + private const val resultsField = "results" + private val serializer = Json.nonstrict + + override fun deserialize(decoder: Decoder): SauceNaoAnswer { + val raw = JsonObjectSerializer.deserialize(decoder) + val header = serializer.fromJson(Header.serializer(), raw.getObject(headerField)) + val results = serializer.fromJson(resultsSerializer, raw.getArray(resultsField)) + + return SauceNaoAnswer(header, results, raw) + } + + override fun serialize(encoder: Encoder, obj: SauceNaoAnswer) { + val resultObject = JsonObject( + obj.raw.content.let { + it + mapOf( + headerField to serializer.toJson(Header.serializer(), obj.header), + resultsField to serializer.toJson(resultsSerializer, obj.results) + ) + } + ) + JsonObject.serializer().serialize(encoder, resultObject) + } +}