dave08
09/15/2024, 11:15 AMdave08
09/15/2024, 4:09 PM@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createNavType(
noinline serializeAsString: (T) -> String = { it.toString() }
) =
typeOf<T>() to JsonNavType(T::class.serializer(), serializeAsString)
@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createNavTypeForSealed(
inheritingTypes: List<KType>
): List<Pair<KType, JsonNavType<T>>> {
val navType = JsonNavType(T::class.serializer())
return inheritingTypes.map { it to navType }
}
@OptIn(InternalSerializationApi::class)
inline fun <reified T : Any> createListNavType() =
typeOf<List<T>>() to JsonNavType(ListSerializer(T::class.serializer()))
class JsonNavType<T>(
private val serializer: KSerializer<T>,
private val serializeAsString: (T) -> String = { it.toString() }
) : NavType<T>(isNullableAllowed = false) {
override fun get(bundle: Bundle, key: String): T? {
return bundle.getString(key)?.let { Json.decodeFromString(serializer, it) }
}
override fun parseValue(value: String): T {
return Json.decodeFromString(serializer, value)
}
override fun put(bundle: Bundle, key: String, value: T) {
bundle.putString(key, Json.encodeToString(serializer, value))
}
override fun serializeAsValue(value: T): String {
return serializeAsString(value)
}
override fun valueEquals(value: T, other: T): Boolean {
return serializeAsString(value) == serializeAsString(other)
}
}