• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 @file:OptIn(ExperimentalSerializationApi::class)
5 
6 package kotlinx.serialization.protobuf.internal
7 
8 import kotlinx.serialization.*
9 import kotlinx.serialization.descriptors.*
10 import kotlinx.serialization.encoding.*
11 
12 internal abstract class ProtobufTaggedDecoder : ProtobufTaggedBase(), Decoder, CompositeDecoder {
SerialDescriptornull13     protected abstract fun SerialDescriptor.getTag(index: Int): ProtoDesc
14 
15     protected abstract fun decodeTaggedBoolean(tag: ProtoDesc): Boolean
16     protected abstract fun decodeTaggedByte(tag: ProtoDesc): Byte
17     protected abstract fun decodeTaggedShort(tag: ProtoDesc): Short
18     protected abstract fun decodeTaggedInt(tag: ProtoDesc): Int
19     protected abstract fun decodeTaggedLong(tag: ProtoDesc): Long
20     protected abstract fun decodeTaggedFloat(tag: ProtoDesc): Float
21     protected abstract fun decodeTaggedDouble(tag: ProtoDesc): Double
22     protected abstract fun decodeTaggedChar(tag: ProtoDesc): Char
23     protected abstract fun decodeTaggedString(tag: ProtoDesc): String
24     protected abstract fun decodeTaggedEnum(tag: ProtoDesc, enumDescription: SerialDescriptor): Int
25     protected abstract fun <T : Any?> decodeSerializableValue(deserializer: DeserializationStrategy<T>, previousValue: T?): T
26 
27     protected open fun decodeTaggedInline(tag: ProtoDesc, inlineDescriptor: SerialDescriptor): Decoder = this.apply { pushTag(tag) }
28 
decodeNotNullMarknull29     override fun decodeNotNullMark(): Boolean = true
30     final override fun decodeNull(): Nothing? = null
31     final override fun decodeBoolean(): Boolean = decodeTaggedBoolean(popTagOrDefault())
32     final override fun decodeByte(): Byte = decodeTaggedByte(popTagOrDefault())
33     final override fun decodeShort(): Short = decodeTaggedShort(popTagOrDefault())
34     final override fun decodeInt(): Int = decodeTaggedInt(popTagOrDefault())
35     final override fun decodeLong(): Long = decodeTaggedLong(popTagOrDefault())
36     final override fun decodeFloat(): Float = decodeTaggedFloat(popTagOrDefault())
37     final override fun decodeDouble(): Double = decodeTaggedDouble(popTagOrDefault())
38     final override fun decodeChar(): Char = decodeTaggedChar(popTagOrDefault())
39     final override fun decodeString(): String = decodeTaggedString(popTagOrDefault())
40     final override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = decodeTaggedEnum(popTagOrDefault(), enumDescriptor)
41 
42     override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder {
43         return this
44     }
45 
endStructurenull46     override fun endStructure(descriptor: SerialDescriptor) {
47         // Nothing
48     }
49 
decodeBooleanElementnull50     final override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean =
51         decodeTaggedBoolean(descriptor.getTag(index))
52 
53     final override fun decodeByteElement(descriptor: SerialDescriptor, index: Int): Byte =
54         decodeTaggedByte(descriptor.getTag(index))
55 
56     final override fun decodeShortElement(descriptor: SerialDescriptor, index: Int): Short =
57         decodeTaggedShort(descriptor.getTag(index))
58 
59     final override fun decodeIntElement(descriptor: SerialDescriptor, index: Int): Int =
60         decodeTaggedInt(descriptor.getTag(index))
61 
62     final override fun decodeLongElement(descriptor: SerialDescriptor, index: Int): Long =
63         decodeTaggedLong(descriptor.getTag(index))
64 
65     final override fun decodeFloatElement(descriptor: SerialDescriptor, index: Int): Float =
66         decodeTaggedFloat(descriptor.getTag(index))
67 
68     final override fun decodeDoubleElement(descriptor: SerialDescriptor, index: Int): Double =
69         decodeTaggedDouble(descriptor.getTag(index))
70 
71     final override fun decodeCharElement(descriptor: SerialDescriptor, index: Int): Char =
72         decodeTaggedChar(descriptor.getTag(index))
73 
74     final override fun decodeStringElement(descriptor: SerialDescriptor, index: Int): String =
75         decodeTaggedString(descriptor.getTag(index))
76 
77     final override fun <T : Any?> decodeSerializableElement(
78         descriptor: SerialDescriptor,
79         index: Int,
80         deserializer: DeserializationStrategy<T>,
81         previousValue: T?
82     ): T = tagBlock(descriptor.getTag(index)) { decodeSerializableValue(deserializer, previousValue) }
83 
decodeNullableSerializableElementnull84     final override fun <T : Any> decodeNullableSerializableElement(
85         descriptor: SerialDescriptor,
86         index: Int,
87         deserializer: DeserializationStrategy<T?>,
88         previousValue: T?
89     ): T? = tagBlock(descriptor.getTag(index)) {
90         if (decodeNotNullMark()) {
91             decodeSerializableValue(deserializer, previousValue)
92         } else {
93             decodeNull()
94         }
95     }
96 
decodeInlinenull97     override fun decodeInline(descriptor: SerialDescriptor): Decoder {
98         return decodeTaggedInline(popTag(), descriptor)
99     }
100 
decodeInlineElementnull101     override fun decodeInlineElement(
102         descriptor: SerialDescriptor,
103         index: Int
104     ): Decoder {
105         return decodeTaggedInline(descriptor.getTag(index), descriptor.getElementDescriptor(index))
106     }
107 }
108