Skip to content

Instantly share code, notes, and snippets.

View steliosfran's full-sized avatar

Stelios Frantzeskakis steliosfran

View GitHub Profile
class ChatViewModel(
loadChatMessagesUseCase: LoadChatMessagesUseCase,
private val getChatMessagesUseCase: GetChatMessagesUseCase,
private val sendTextMessageUseCase: SendTextMessageUseCase,
private val user: User
) : BaseViewModel() {
data class State(
val messages: List<MessageUiModel>
)
fun createMoshi(): Moshi {
return Moshi.Builder()
.add(createEnumJsonAdapter<Role>())
.add(createEnumJsonAdapter<Category>())
.add(createEnumJsonAdapter<AnotherEnum>())
// ...
.build()
}
inline fun <reified T> createEnumJsonAdapter(): JsonAdapter<T> where T : Enum<T>, T : IEnumValue {
return object : JsonAdapter<T>() {
@FromJson
override fun fromJson(reader: JsonReader): T? {
return if (reader.peek() != JsonReader.Token.NULL) {
enumValues<T>().firstOrNull { it.value == reader.nextInt() }
} else {
reader.nextNull()
}
}
class GenericEnumJsonAdapter<T> : JsonAdapter<T>() {
@FromJson
override fun fromJson(reader: JsonReader): T? {
// Cannot access enumValues<T>()
}
@ToJson
override fun toJson(writer: JsonWriter, value: T?) {
// ...
}
enum class Role(override val value: Int) : IEnumValue {
Admin(1),
Moderator(2)
}
object GenericEnumFactory {
inline fun <reified T> fromValueOrNull(rawValue: Int?): T? where T : Enum<T>, T : IEnumValue {
return enumValues<T>().firstOrNull { it.value == rawValue }
}
}
interface IEnumValue {
val value: Int
}
enum class Role(override val value: Int) : IEnumValue {
Admin(1),
Moderator(2);
companion object {
fun fromValueOrNull(value: Int): Role? {
class RoleEnumJsonAdapter : JsonAdapter<Role>() {
@FromJson
override fun fromJson(reader: JsonReader): Role? {
return if (reader.peek() != JsonReader.Token.NULL) {
Role.fromValueOrNull(reader.nextInt())
} else {
reader.nextNull()
}
}
enum class Role(val value: Int) {
Admin(1),
Moderator(2);
companion object {
fun fromValueOrNull(value: Int): Role? {
return values().firstOrNull { it.value == value }
}
}
}
{
"name": "John",
"role": 1
}
{
"name": "John",
"role": "Admin"
}