facet_generate 0.16.0

Generate Swift, Kotlin and TypeScript from types annotated with `#[derive(Facet)]`
Documentation
package com.example

import kotlinx.serialization.*
import kotlinx.serialization.builtins.*
import kotlinx.serialization.descriptors.*
import kotlinx.serialization.encoding.*
import kotlinx.serialization.json.*
import kotlinx.serialization.modules.*

@Deprecated(message = "Use `MySuperAwesomeAlias` instead")
typealias MyLegacyAlias = UInt

@Deprecated(message = "Use `MySuperAwesomeStruct` instead")
@Serializable
data class MyLegacyStruct(val field: String)

@Deprecated(message = "Use `MySuperAwesomeEnum` instead")
@Serializable
enum class MyLegacyEnum {
    @SerialName("VariantA") VARIANT_A,
    @SerialName("VariantB") VARIANT_B,
    @SerialName("VariantC") VARIANT_C;

    val serialName: String
        get() = javaClass.getDeclaredField(name).getAnnotation(SerialName::class.java)!!.value
}

@Serializable
enum class MyUnitEnum {
    @SerialName("VariantA") VARIANT_A,
    @SerialName("VariantB") VARIANT_B,
    @Deprecated(message = "Use `VariantB` instead") @SerialName("LegacyVariant") LEGACY_VARIANT;

    val serialName: String
        get() = javaClass.getDeclaredField(name).getAnnotation(SerialName::class.java)!!.value
}

@Serializable
@JsonClassDiscriminator("type")
sealed interface MyInternallyTaggedEnum {
    @Serializable
    @SerialName("VariantA")
    data class VariantA(val field: String) : MyInternallyTaggedEnum

    @Serializable
    @SerialName("VariantB")
    data class VariantB(val field: UInt) : MyInternallyTaggedEnum

    @Deprecated(message = "Use `VariantA` instead")
    @Serializable
    @SerialName("LegacyVariant")
    data class LegacyVariant(val field: Boolean) : MyInternallyTaggedEnum
}

@Serializable(with = MyExternallyTaggedEnum.Serializer::class)
sealed interface MyExternallyTaggedEnum {
    @Serializable data class VariantA(val value: String) : MyExternallyTaggedEnum

    @Serializable data class VariantB(val value: UInt) : MyExternallyTaggedEnum

    @Deprecated(message = "Use `VariantB` instead")
    @Serializable
    data class LegacyVariant(val value: Boolean) : MyExternallyTaggedEnum

    object Serializer : KSerializer<MyExternallyTaggedEnum> {
        override val descriptor =
                buildClassSerialDescriptor("MyExternallyTaggedEnum") {
                    element<VariantA>("VariantA", isOptional = true)
                    element<VariantB>("VariantB", isOptional = true)
                    element<LegacyVariant>("LegacyVariant", isOptional = true)
                }

        override fun serialize(encoder: Encoder, value: MyExternallyTaggedEnum) {
            encoder.encodeStructure(descriptor) {
                when (value) {
                    is VariantA ->
                            encodeSerializableElement(
                                    descriptor,
                                    0,
                                    String.serializer(),
                                    value.value
                            )
                    is VariantB ->
                            encodeSerializableElement(descriptor, 1, UInt.serializer(), value.value)
                    is LegacyVariant ->
                            encodeSerializableElement(
                                    descriptor,
                                    2,
                                    Boolean.serializer(),
                                    value.value
                            )
                }
            }
        }

        override fun deserialize(decoder: Decoder): MyExternallyTaggedEnum {
            return decoder.decodeStructure(descriptor) {
                when (val index = decodeElementIndex(descriptor)) {
                    0 -> {
                        val value = decodeSerializableElement(descriptor, 0, String.serializer())
                        return@decodeStructure VariantA(value)
                    }
                    1 -> {
                        val value = decodeSerializableElement(descriptor, 1, UInt.serializer())
                        return@decodeStructure VariantB(value)
                    }
                    2 -> {
                        val value = decodeSerializableElement(descriptor, 2, Boolean.serializer())
                        return@decodeStructure LegacyVariant(value)
                    }
                    else ->
                            throw Exception(
                                    "Unknown enum variant $index for MyExternallyTaggedEnum"
                            )
                }
            }
        }
    }
}