1*57b5a4a6SAndroid Build Coastguard Worker // This file was automatically generated from formats.md by Knit tool. Do not edit.
2*57b5a4a6SAndroid Build Coastguard Worker package example.exampleFormats13
3*57b5a4a6SAndroid Build Coastguard Worker
4*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.*
5*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.descriptors.*
6*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.encoding.*
7*57b5a4a6SAndroid Build Coastguard Worker import kotlinx.serialization.modules.*
8*57b5a4a6SAndroid Build Coastguard Worker
9*57b5a4a6SAndroid Build Coastguard Worker class ListEncoder : AbstractEncoder() {
10*57b5a4a6SAndroid Build Coastguard Worker val list = mutableListOf<Any>()
11*57b5a4a6SAndroid Build Coastguard Worker
12*57b5a4a6SAndroid Build Coastguard Worker override val serializersModule: SerializersModule = EmptySerializersModule()
13*57b5a4a6SAndroid Build Coastguard Worker
encodeValuenull14*57b5a4a6SAndroid Build Coastguard Worker override fun encodeValue(value: Any) {
15*57b5a4a6SAndroid Build Coastguard Worker list.add(value)
16*57b5a4a6SAndroid Build Coastguard Worker }
17*57b5a4a6SAndroid Build Coastguard Worker
beginCollectionnull18*57b5a4a6SAndroid Build Coastguard Worker override fun beginCollection(descriptor: SerialDescriptor, collectionSize: Int): CompositeEncoder {
19*57b5a4a6SAndroid Build Coastguard Worker encodeInt(collectionSize)
20*57b5a4a6SAndroid Build Coastguard Worker return this
21*57b5a4a6SAndroid Build Coastguard Worker }
22*57b5a4a6SAndroid Build Coastguard Worker }
23*57b5a4a6SAndroid Build Coastguard Worker
encodeToListnull24*57b5a4a6SAndroid Build Coastguard Worker fun <T> encodeToList(serializer: SerializationStrategy<T>, value: T): List<Any> {
25*57b5a4a6SAndroid Build Coastguard Worker val encoder = ListEncoder()
26*57b5a4a6SAndroid Build Coastguard Worker encoder.encodeSerializableValue(serializer, value)
27*57b5a4a6SAndroid Build Coastguard Worker return encoder.list
28*57b5a4a6SAndroid Build Coastguard Worker }
29*57b5a4a6SAndroid Build Coastguard Worker
encodeToListnull30*57b5a4a6SAndroid Build Coastguard Worker inline fun <reified T> encodeToList(value: T) = encodeToList(serializer(), value)
31*57b5a4a6SAndroid Build Coastguard Worker
32*57b5a4a6SAndroid Build Coastguard Worker class ListDecoder(val list: ArrayDeque<Any>, var elementsCount: Int = 0) : AbstractDecoder() {
33*57b5a4a6SAndroid Build Coastguard Worker private var elementIndex = 0
34*57b5a4a6SAndroid Build Coastguard Worker
35*57b5a4a6SAndroid Build Coastguard Worker override val serializersModule: SerializersModule = EmptySerializersModule()
36*57b5a4a6SAndroid Build Coastguard Worker
37*57b5a4a6SAndroid Build Coastguard Worker override fun decodeValue(): Any = list.removeFirst()
38*57b5a4a6SAndroid Build Coastguard Worker
39*57b5a4a6SAndroid Build Coastguard Worker override fun decodeElementIndex(descriptor: SerialDescriptor): Int {
40*57b5a4a6SAndroid Build Coastguard Worker if (elementIndex == elementsCount) return CompositeDecoder.DECODE_DONE
41*57b5a4a6SAndroid Build Coastguard Worker return elementIndex++
42*57b5a4a6SAndroid Build Coastguard Worker }
43*57b5a4a6SAndroid Build Coastguard Worker
44*57b5a4a6SAndroid Build Coastguard Worker override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder =
45*57b5a4a6SAndroid Build Coastguard Worker ListDecoder(list, descriptor.elementsCount)
46*57b5a4a6SAndroid Build Coastguard Worker
47*57b5a4a6SAndroid Build Coastguard Worker override fun decodeSequentially(): Boolean = true
48*57b5a4a6SAndroid Build Coastguard Worker
49*57b5a4a6SAndroid Build Coastguard Worker override fun decodeCollectionSize(descriptor: SerialDescriptor): Int =
50*57b5a4a6SAndroid Build Coastguard Worker decodeInt().also { elementsCount = it }
51*57b5a4a6SAndroid Build Coastguard Worker }
52*57b5a4a6SAndroid Build Coastguard Worker
decodeFromListnull53*57b5a4a6SAndroid Build Coastguard Worker fun <T> decodeFromList(list: List<Any>, deserializer: DeserializationStrategy<T>): T {
54*57b5a4a6SAndroid Build Coastguard Worker val decoder = ListDecoder(ArrayDeque(list))
55*57b5a4a6SAndroid Build Coastguard Worker return decoder.decodeSerializableValue(deserializer)
56*57b5a4a6SAndroid Build Coastguard Worker }
57*57b5a4a6SAndroid Build Coastguard Worker
decodeFromListnull58*57b5a4a6SAndroid Build Coastguard Worker inline fun <reified T> decodeFromList(list: List<Any>): T = decodeFromList(list, serializer())
59*57b5a4a6SAndroid Build Coastguard Worker
60*57b5a4a6SAndroid Build Coastguard Worker @Serializable
61*57b5a4a6SAndroid Build Coastguard Worker data class Project(val name: String, val owners: List<User>, val votes: Int)
62*57b5a4a6SAndroid Build Coastguard Worker
63*57b5a4a6SAndroid Build Coastguard Worker @Serializable
64*57b5a4a6SAndroid Build Coastguard Worker data class User(val name: String)
65*57b5a4a6SAndroid Build Coastguard Worker
66*57b5a4a6SAndroid Build Coastguard Worker fun main() {
67*57b5a4a6SAndroid Build Coastguard Worker val data = Project("kotlinx.serialization", listOf(User("kotlin"), User("jetbrains")), 9000)
68*57b5a4a6SAndroid Build Coastguard Worker val list = encodeToList(data)
69*57b5a4a6SAndroid Build Coastguard Worker println(list)
70*57b5a4a6SAndroid Build Coastguard Worker val obj = decodeFromList<Project>(list)
71*57b5a4a6SAndroid Build Coastguard Worker println(obj)
72*57b5a4a6SAndroid Build Coastguard Worker }
73