package io.rebble.libpebblecommon.web import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder import kotlinx.serialization.json.JsonDecoder import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.booleanOrNull import kotlin.uuid.Uuid data class LockerModelWrapper( val locker: LockerModel, val failedToFetchUuids: Set, ) @Serializable data class LockerModel( val applications: List, val nextPageURL: String? = null, ) @Serializable data class LockerAddResponse( val application: LockerEntry, ) @Serializable data class LockerEntry( val id: String, val uuid: String, @SerialName("user_token") val userToken: String? = null, val title: String, val type: String, val category: String, val version: String? = null, val hearts: Int, @SerialName("is_configurable") val isConfigurable: Boolean, @SerialName("is_timeline_enabled") val isTimelineEnabled: Boolean?, val links: LockerEntryLinks, val developer: LockerEntryDeveloper, @SerialName("hardware_platforms") val hardwarePlatforms: List, val compatibility: LockerEntryCompatibility, val capabilities: List? = null, val companions: LockerEntryCompanions, val pbw: LockerEntryPBW? = null, val source: String? = null, ) @Serializable data class LockerEntryLinks( val remove: String, val href: String, val share: String ) @Serializable data class LockerEntryDeveloper( val id: String, val name: String, @SerialName("contact_email") val contactEmail: String ) @Serializable data class LockerEntryPlatform( @SerialName("sdk_version") val sdkVersion: String, @SerialName("pebble_process_info_flags") val pebbleProcessInfoFlags: Int, val name: String, val description: String, val images: LockerEntryPlatformImages ) @Serializable data class LockerEntryPlatformImages( val icon: String, val list: String, val screenshot: String ) @Serializable data class LockerEntryCompatibility( val ios: LockerEntryCompatibilityPhonePlatformDetails, val android: LockerEntryCompatibilityPhonePlatformDetails, val aplite: LockerEntryCompatibilityWatchPlatformDetails, val basalt: LockerEntryCompatibilityWatchPlatformDetails, val chalk: LockerEntryCompatibilityWatchPlatformDetails, val diorite: LockerEntryCompatibilityWatchPlatformDetails, val emery: LockerEntryCompatibilityWatchPlatformDetails, val flint: LockerEntryCompatibilityWatchPlatformDetails? = null, val gabbro: LockerEntryCompatibilityWatchPlatformDetails? = null, ) @Serializable data class LockerEntryCompatibilityPhonePlatformDetails( val supported: Boolean, @SerialName("min_js_version") val minJsVersion: Int? = null ) /** * Deserializer for has_binary which can be a boolean or an empty object {} in the API response. */ private object LenientBooleanSerializer : KSerializer { override val descriptor = PrimitiveSerialDescriptor("LenientBoolean", PrimitiveKind.BOOLEAN) override fun deserialize(decoder: Decoder): Boolean? { if (decoder is JsonDecoder) { val element = decoder.decodeJsonElement() return (element as? JsonPrimitive)?.booleanOrNull } return decoder.decodeBoolean() } override fun serialize(encoder: Encoder, value: Boolean?) { if (value != null) encoder.encodeBoolean(value) } } @Serializable data class LockerEntryCompatibilityWatchPlatformDetails( val supported: Boolean, val firmware: LockerEntryFirmwareVersion, @SerialName("has_binary") @Serializable(with = LenientBooleanSerializer::class) val hasBinary: Boolean? = null, ) @Serializable data class LockerEntryFirmwareVersion( val major: Int, val minor: Int? = null, val patch: Int? = null ) @Serializable data class LockerEntryCompanions( val android: LockerEntryCompanionApp?, val ios: LockerEntryCompanionApp?, ) @Serializable data class LockerEntryCompanionApp( val id: Int, val icon: String, val name: String, val url: String, val required: Boolean, @SerialName("pebblekit_version") val pebblekitVersion: String ) @Serializable data class LockerEntryPBW( val file: String, @SerialName("icon_resource_id") val iconResourceId: Int, @SerialName("release_id") val releaseId: String )