Skip to content

Commit

Permalink
fix: フォールバック可能なSerializable基底クラスを作成した。これによって誕生日を正しく表示できるようになった。
Browse files Browse the repository at this point in the history
  • Loading branch information
pantasystem committed Nov 23, 2023
1 parent e39e23e commit dd15ac0
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ package net.pantasystem.milktea.api.misskey.users
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.serialization.SerialName
import kotlinx.serialization.builtins.nullable
import net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO
import net.pantasystem.milktea.api.misskey.emoji.CustomEmojisTypeSerializer
import net.pantasystem.milktea.api.misskey.emoji.EmojisType
import net.pantasystem.milktea.api.misskey.notes.NoteDTO
import net.pantasystem.milktea.common.serializations.FallbackDefaultValueSerializer
import java.io.Serializable

/**
Expand Down Expand Up @@ -104,7 +106,7 @@ data class UserDTO(
val fields: List<FieldDTO>? = null,

@SerialName("birthday")
@kotlinx.serialization.Transient
@kotlinx.serialization.Serializable(with = BirthdaySerializer::class)
val birthday: LocalDate? = null,

@SerialName("createdAt")
Expand Down Expand Up @@ -185,3 +187,5 @@ data class UserDTO(
@SerialName("public") Public, @SerialName("followers") Followers, @SerialName("private") Private,
}
}

private object BirthdaySerializer : FallbackDefaultValueSerializer<LocalDate?>(LocalDate.serializer().nullable, null)
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package net.pantasystem.milktea.common.serializations

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

abstract class FallbackDefaultValueSerializer<T>(private val serializer: KSerializer<T>, private val defaultValue: T) :
KSerializer<T> {

// Alternative to taking values in param, take clazz: Class<T>
// - private val values = clazz.enumConstants
override val descriptor: SerialDescriptor = serializer.descriptor


override fun serialize(encoder: Encoder, value: T) {
serializer.serialize(encoder, value)
}

override fun deserialize(decoder: Decoder): T {
return try {
serializer.deserialize(decoder)
} catch (e: Exception) {
defaultValue
}
}
}

0 comments on commit dd15ac0

Please sign in to comment.