dave08
09/16/2024, 9:43 AMdave08
09/16/2024, 9:44 AM@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)
}
@OptIn(ExperimentalSerializationApi::class)
override val name: String = serializer.descriptor.serialName
}
dave08
09/16/2024, 1:04 PMIan Lake
09/16/2024, 2:12 PMdave08
09/16/2024, 2:15 PM