@@ -15,16 +15,6 @@ import kotlinx.serialization.encoding.*
1515 * Serializer object providing [SerializationStrategy] and [DeserializationStrategy] for [CborElement].
1616 * It can only be used by with [Cbor] format and its input ([CborDecoder] and [CborEncoder]).
1717 */
18-
19- internal fun CborWriter.encodeTags (value : CborElement ) { // Encode tags if present
20- if (value.tags.isNotEmpty()) {
21- for (tag in value.tags) {
22- encodeTag(tag)
23- }
24- }
25-
26- }
27-
2818internal object CborElementSerializer : KSerializer<CborElement> {
2919 override val descriptor: SerialDescriptor =
3020 buildSerialDescriptor(" kotlinx.serialization.cbor.CborElement" , PolymorphicKind .SEALED ) {
@@ -42,7 +32,7 @@ internal object CborElementSerializer : KSerializer<CborElement> {
4232 }
4333
4434 override fun serialize (encoder : Encoder , value : CborElement ) {
45- verify( encoder)
35+ encoder.asCborEncoder( )
4636
4737 // Encode the value
4838 when (value) {
@@ -67,10 +57,8 @@ internal object CborPrimitiveSerializer : KSerializer<CborPrimitive> {
6757 buildSerialDescriptor(" kotlinx.serialization.cbor.CborPrimitive" , PrimitiveKind .STRING )
6858
6959 override fun serialize (encoder : Encoder , value : CborPrimitive ) {
70- verify(encoder)
7160 val cborEncoder = encoder.asCborEncoder()
7261
73-
7462 cborEncoder.encodeTags(value)
7563
7664 when (value) {
@@ -96,17 +84,17 @@ internal object CborPrimitiveSerializer : KSerializer<CborPrimitive> {
9684 * It can only be used by with [Cbor] format an its input ([CborDecoder] and [CborEncoder]).
9785 */
9886internal object CborNullSerializer : KSerializer<CborNull> {
99- // technically, CborNull is an object, but it does not call beginStructure/endStructure at all
87+
10088 override val descriptor: SerialDescriptor =
10189 buildSerialDescriptor(" kotlinx.serialization.cbor.CborNull" , SerialKind .ENUM )
10290
10391 override fun serialize (encoder : Encoder , value : CborNull ) {
104- verify( encoder).encodeTags(value)
92+ encoder.asCborEncoder( ).encodeTags(value)
10593 encoder.encodeNull()
10694 }
10795
10896 override fun deserialize (decoder : Decoder ): CborNull {
109- verify( decoder)
97+ decoder.asCborDecoder( )
11098 if (decoder.decodeNotNullMark()) {
11199 throw CborDecodingException (" Expected 'null' literal" )
112100 }
@@ -119,24 +107,26 @@ public object CborIntSerializer : KSerializer<CborNegativeInt> {
119107 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborInt" , PrimitiveKind .LONG )
120108
121109 override fun serialize (encoder : Encoder , value : CborNegativeInt ) {
122- verify( encoder).encodeTags(value)
110+ encoder.asCborEncoder( ).encodeTags(value)
123111 encoder.encodeLong(value.value)
124112 }
125113
126114 override fun deserialize (decoder : Decoder ): CborNegativeInt {
127- return CborNegativeInt ( decoder.decodeLong())
115+ decoder.asCborDecoder()
116+ return CborNegativeInt (decoder.decodeLong())
128117 }
129118}
130119
131120public object CborUIntSerializer : KSerializer<CborPositiveInt> {
132121 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" CborUInt" , PrimitiveKind .LONG )
133122
134123 override fun serialize (encoder : Encoder , value : CborPositiveInt ) {
135- verify( encoder).encodeTags(value)
124+ encoder.asCborEncoder( ).encodeTags(value)
136125 encoder.encodeInline(descriptor).encodeSerializableValue(ULong .serializer(), value.value)
137126 }
138127
139128 override fun deserialize (decoder : Decoder ): CborPositiveInt {
129+ decoder.asCborDecoder()
140130 return CborPositiveInt (decoder.decodeInline(descriptor).decodeSerializableValue(ULong .serializer()))
141131 }
142132}
@@ -145,11 +135,12 @@ public object CborDoubleSerializer : KSerializer<CborDouble> {
145135 override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborDouble" , PrimitiveKind .DOUBLE )
146136
147137 override fun serialize (encoder : Encoder , value : CborDouble ) {
148- verify( encoder).encodeTags(value)
138+ encoder.asCborEncoder( ).encodeTags(value)
149139 encoder.encodeDouble(value.value)
150140 }
151141
152142 override fun deserialize (decoder : Decoder ): CborDouble {
143+ decoder.asCborDecoder()
153144 return CborDouble (decoder.decodeDouble())
154145 }
155146}
@@ -163,13 +154,13 @@ public object CborStringSerializer : KSerializer<CborString> {
163154 PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborString" , PrimitiveKind .STRING )
164155
165156 override fun serialize (encoder : Encoder , value : CborString ) {
166- verify( encoder).encodeTags(value)
157+ encoder.asCborEncoder( ).encodeTags(value)
167158 encoder.encodeString(value.value)
168159 }
169160
170161 override fun deserialize (decoder : Decoder ): CborString {
171- val input = decoder.asCborDecoder()
172- val element = input .decodeCborElement()
162+ val cborDecoder = decoder.asCborDecoder()
163+ val element = cborDecoder .decodeCborElement()
173164 if (element !is CborString ) throw CborDecodingException (" Unexpected CBOR element, expected CborString, had ${element::class } " )
174165 return element
175166 }
@@ -184,13 +175,13 @@ public object CborBooleanSerializer : KSerializer<CborBoolean> {
184175 PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborBoolean" , PrimitiveKind .BOOLEAN )
185176
186177 override fun serialize (encoder : Encoder , value : CborBoolean ) {
187- verify( encoder).encodeTags(value)
178+ encoder.asCborEncoder( ).encodeTags(value)
188179 encoder.encodeBoolean(value.boolean)
189180 }
190181
191182 override fun deserialize (decoder : Decoder ): CborBoolean {
192- val input = decoder.asCborDecoder()
193- val element = input .decodeCborElement()
183+ val cborDecoder = decoder.asCborDecoder()
184+ val element = cborDecoder .decodeCborElement()
194185 if (element !is CborBoolean ) throw CborDecodingException (" Unexpected CBOR element, expected CborBoolean, had ${element::class } " )
195186 return element
196187 }
@@ -205,14 +196,14 @@ public object CborByteStringSerializer : KSerializer<CborByteString> {
205196 PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborByteString" , PrimitiveKind .STRING )
206197
207198 override fun serialize (encoder : Encoder , value : CborByteString ) {
208- val cborEncoder = verify( encoder)
199+ val cborEncoder = encoder.asCborEncoder( )
209200 cborEncoder.encodeTags(value)
210201 cborEncoder.encodeByteArray(value.bytes)
211202 }
212203
213204 override fun deserialize (decoder : Decoder ): CborByteString {
214- val input = decoder.asCborDecoder()
215- val element = input .decodeCborElement()
205+ val cborDecoder = decoder.asCborDecoder()
206+ val element = cborDecoder .decodeCborElement()
216207 if (element !is CborByteString ) throw CborDecodingException (" Unexpected CBOR element, expected CborByteString, had ${element::class } " )
217208 return element
218209 }
@@ -232,16 +223,13 @@ public object CborMapSerializer : KSerializer<CborMap> {
232223 override val descriptor: SerialDescriptor = CborMapDescriptor
233224
234225 override fun serialize (encoder : Encoder , value : CborMap ) {
235- verify(encoder)
236226 val cborEncoder = encoder.asCborEncoder()
237-
238227 cborEncoder.encodeTags(value)
239-
240228 MapSerializer (CborElementSerializer , CborElementSerializer ).serialize(encoder, value)
241229 }
242230
243231 override fun deserialize (decoder : Decoder ): CborMap {
244- verify( decoder)
232+ decoder.asCborDecoder( )
245233 return CborMap (MapSerializer (CborElementSerializer , CborElementSerializer ).deserialize(decoder))
246234 }
247235}
@@ -259,34 +247,25 @@ public object CborListSerializer : KSerializer<CborList> {
259247 override val descriptor: SerialDescriptor = CborListDescriptor
260248
261249 override fun serialize (encoder : Encoder , value : CborList ) {
262- verify(encoder)
263250 val cborEncoder = encoder.asCborEncoder()
264-
265251 cborEncoder.encodeTags(value)
266-
267252 ListSerializer (CborElementSerializer ).serialize(encoder, value)
268253 }
269254
270255 override fun deserialize (decoder : Decoder ): CborList {
271- verify( decoder)
256+ decoder.asCborDecoder( )
272257 return CborList (ListSerializer (CborElementSerializer ).deserialize(decoder))
273258 }
274259}
275260
276- private fun verify (encoder : Encoder ) =
277- encoder.asCborEncoder()
278-
279-
280- private fun verify (decoder : Decoder ) {
281- decoder.asCborDecoder()
282- }
283261
284262internal fun Decoder.asCborDecoder (): CborDecoder = this as ? CborDecoder
285263 ? : throw IllegalStateException (
286264 " This serializer can be used only with Cbor format." +
287265 " Expected Decoder to be CborDecoder, got ${this ::class } "
288266 )
289267
268+ /* need to expose writer to access encodeTag()*/
290269internal fun Encoder.asCborEncoder () = this as ? CborWriter
291270 ? : throw IllegalStateException (
292271 " This serializer can be used only with Cbor format." +
@@ -313,4 +292,13 @@ private fun defer(deferred: () -> SerialDescriptor): SerialDescriptor = object :
313292 override fun getElementAnnotations (index : Int ): List <Annotation > = original.getElementAnnotations(index)
314293 override fun getElementDescriptor (index : Int ): SerialDescriptor = original.getElementDescriptor(index)
315294 override fun isElementOptional (index : Int ): Boolean = original.isElementOptional(index)
295+ }
296+
297+ private fun CborWriter.encodeTags (value : CborElement ) { // Encode tags if present
298+ if (value.tags.isNotEmpty()) {
299+ for (tag in value.tags) {
300+ encodeTag(tag)
301+ }
302+ }
303+
316304}
0 commit comments