Uberto Barbini
10/10/2021, 4:20 PMobject JTitleType : JStringRepresentable<TitleType>() {
override val cons: (String) -> TitleType = ???
override val render: (TitleType) -> String = TitleType::label
}
Razvan
10/10/2021, 4:36 PMenum class TitleType(val label: String) {
Movie("movie"), Series("series"), Episoode("episode");
companion object {
fun fromLabel(label: String) = values().firstOrNull { it.label == label}
}
}
but returns a null able type and JStringRepresetable requires an Any… well i could make it throw instead (although I would prefer null) but that does not fix everything still can see to write the JTitleRequest
type
to use it….
That would be somethig like:
data class TitleRequest(
val id: String,
val type: TitleType?
)
enum class TitleType(val label: String) {
Movie("movie"), Series("series"), Episoode("episode");
companion object {
fun fromLabel(label: String) = values().first { it.label == label}
}
}
object JTitleType : JStringRepresentable<TitleType>() {
override val cons: (String) -> TitleType = ::fromLabel
override val render: (TitleType) -> String = TitleType::label
}
object JTitleRequest : JAny<TitleRequest>() {
private val id by str(TitleRequest::id)
private val type by str(???)
override fun JsonNodeObject.deserializeOrThrow(): TitleRequest =
TitleRequest(
id = +id,
type = TitleType.fromLabel(+type)
)
}
Uberto Barbini
10/10/2021, 7:24 PMdata class TitleRequest(
val id: String,
val type: TitleType?
)
enum class TitleType(val label: String) {
Movie("movie"), Series("series"), Episoode("episode");
companion object {
fun fromLabel(label: String) = values().first { it.label == label}
}
}
object JTitleType : JStringRepresentable<TitleType>() {
override val cons: (String) -> TitleType = ::fromLabel
override val render: (TitleType) -> String = TitleType::label
}
object JTitleRequest : JAny<TitleRequest>() {
private val id by str(TitleRequest::id)
private val type by str(TitleRequest::type)
override fun JsonNodeObject.deserializeOrThrow(): TitleRequest =
TitleRequest(
id = +id,
type = +type
)
}
Razvan
10/10/2021, 8:23 PMprivate val type by str(TitleRequest::type)
doesn't do the job
@Test
fun aTest() {
val inValue = TitleRequest("tom", TitleType.Movie)
val json = JTitleRequest.toPrettyJson(inValue)
json shouldBe """
{
"id": "tom",
"type": "movie"
}
""".trimIndent()
}
fails as it encodes the Enum name Movies
instead the label movie
expected:<"{
"id": "tom",
"type": "movie"
}"> but was:<"{
"id": "tom",
"type": "Movie"
}">
private val type by obj(JTitleType, TitleRequest::type)
and a few tricks
data class TitleRequest(
val id: String,
val type: TitleType?
)
enum class TitleType(val label: String) {
Movie("movie"), Series("series"), Episoode("episode");
companion object {
fun fromLabel(label: String) = values().first { it.label == label }
}
}
object JTitleType : JStringRepresentable<TitleType>() {
override val cons: (String) -> TitleType = ::fromLabel
override val render: (TitleType) -> String = TitleType::label
object JTitleRequest : JAny<TitleRequest>() {
private val id by str(TitleRequest::id)
private val type by obj(JTitleType, TitleRequest::type)
override fun JsonNodeObject.deserializeOrThrow(): TitleRequest =
TitleRequest(
id = +id,
type = type.getter(this).recover { null }
)
}
class KondorTest {
@Test
fun `type not null`() {
val inValue = TitleRequest("tom", TitleType.Movie)
val json = JTitleRequest.toPrettyJson(inValue).also {
println(it)
}
json shouldBe """
{
"id": "tom",
"type": "movie"
}
""".trimIndent()
}
@Test
fun `type is null`() {
val inValue = TitleRequest("tom", null)
val json = JTitleRequest.toPrettyJson(inValue).also {
println(it)
}
json shouldBe """
{
"id": "tom"
}
""".trimIndent()
}
@Test
fun `type is set to null when type is unknown`() {
val inValue = """
{
"id": "tom",
"type": "unknown"
}
""".trimIndent()
val title = JTitleRequest.fromJson(inValue).orThrow()
title shouldBe TitleRequest("tom", null)
}
}