@@ -15,16 +15,6 @@ import kotlinx.serialization.encoding.*
15
15
* Serializer object providing [SerializationStrategy] and [DeserializationStrategy] for [CborElement].
16
16
* It can only be used by with [Cbor] format and its input ([CborDecoder] and [CborEncoder]).
17
17
*/
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
-
28
18
internal object CborElementSerializer : KSerializer<CborElement> {
29
19
override val descriptor: SerialDescriptor =
30
20
buildSerialDescriptor(" kotlinx.serialization.cbor.CborElement" , PolymorphicKind .SEALED ) {
@@ -42,7 +32,7 @@ internal object CborElementSerializer : KSerializer<CborElement> {
42
32
}
43
33
44
34
override fun serialize (encoder : Encoder , value : CborElement ) {
45
- verify( encoder)
35
+ encoder.asCborEncoder( )
46
36
47
37
// Encode the value
48
38
when (value) {
@@ -67,10 +57,8 @@ internal object CborPrimitiveSerializer : KSerializer<CborPrimitive> {
67
57
buildSerialDescriptor(" kotlinx.serialization.cbor.CborPrimitive" , PrimitiveKind .STRING )
68
58
69
59
override fun serialize (encoder : Encoder , value : CborPrimitive ) {
70
- verify(encoder)
71
60
val cborEncoder = encoder.asCborEncoder()
72
61
73
-
74
62
cborEncoder.encodeTags(value)
75
63
76
64
when (value) {
@@ -96,17 +84,17 @@ internal object CborPrimitiveSerializer : KSerializer<CborPrimitive> {
96
84
* It can only be used by with [Cbor] format an its input ([CborDecoder] and [CborEncoder]).
97
85
*/
98
86
internal object CborNullSerializer : KSerializer<CborNull> {
99
- // technically, CborNull is an object, but it does not call beginStructure/endStructure at all
87
+
100
88
override val descriptor: SerialDescriptor =
101
89
buildSerialDescriptor(" kotlinx.serialization.cbor.CborNull" , SerialKind .ENUM )
102
90
103
91
override fun serialize (encoder : Encoder , value : CborNull ) {
104
- verify( encoder).encodeTags(value)
92
+ encoder.asCborEncoder( ).encodeTags(value)
105
93
encoder.encodeNull()
106
94
}
107
95
108
96
override fun deserialize (decoder : Decoder ): CborNull {
109
- verify( decoder)
97
+ decoder.asCborDecoder( )
110
98
if (decoder.decodeNotNullMark()) {
111
99
throw CborDecodingException (" Expected 'null' literal" )
112
100
}
@@ -119,24 +107,26 @@ public object CborIntSerializer : KSerializer<CborNegativeInt> {
119
107
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborInt" , PrimitiveKind .LONG )
120
108
121
109
override fun serialize (encoder : Encoder , value : CborNegativeInt ) {
122
- verify( encoder).encodeTags(value)
110
+ encoder.asCborEncoder( ).encodeTags(value)
123
111
encoder.encodeLong(value.value)
124
112
}
125
113
126
114
override fun deserialize (decoder : Decoder ): CborNegativeInt {
127
- return CborNegativeInt ( decoder.decodeLong())
115
+ decoder.asCborDecoder()
116
+ return CborNegativeInt (decoder.decodeLong())
128
117
}
129
118
}
130
119
131
120
public object CborUIntSerializer : KSerializer<CborPositiveInt> {
132
121
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" CborUInt" , PrimitiveKind .LONG )
133
122
134
123
override fun serialize (encoder : Encoder , value : CborPositiveInt ) {
135
- verify( encoder).encodeTags(value)
124
+ encoder.asCborEncoder( ).encodeTags(value)
136
125
encoder.encodeInline(descriptor).encodeSerializableValue(ULong .serializer(), value.value)
137
126
}
138
127
139
128
override fun deserialize (decoder : Decoder ): CborPositiveInt {
129
+ decoder.asCborDecoder()
140
130
return CborPositiveInt (decoder.decodeInline(descriptor).decodeSerializableValue(ULong .serializer()))
141
131
}
142
132
}
@@ -145,11 +135,12 @@ public object CborDoubleSerializer : KSerializer<CborDouble> {
145
135
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborDouble" , PrimitiveKind .DOUBLE )
146
136
147
137
override fun serialize (encoder : Encoder , value : CborDouble ) {
148
- verify( encoder).encodeTags(value)
138
+ encoder.asCborEncoder( ).encodeTags(value)
149
139
encoder.encodeDouble(value.value)
150
140
}
151
141
152
142
override fun deserialize (decoder : Decoder ): CborDouble {
143
+ decoder.asCborDecoder()
153
144
return CborDouble (decoder.decodeDouble())
154
145
}
155
146
}
@@ -163,13 +154,13 @@ public object CborStringSerializer : KSerializer<CborString> {
163
154
PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborString" , PrimitiveKind .STRING )
164
155
165
156
override fun serialize (encoder : Encoder , value : CborString ) {
166
- verify( encoder).encodeTags(value)
157
+ encoder.asCborEncoder( ).encodeTags(value)
167
158
encoder.encodeString(value.value)
168
159
}
169
160
170
161
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()
173
164
if (element !is CborString ) throw CborDecodingException (" Unexpected CBOR element, expected CborString, had ${element::class } " )
174
165
return element
175
166
}
@@ -184,13 +175,13 @@ public object CborBooleanSerializer : KSerializer<CborBoolean> {
184
175
PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborBoolean" , PrimitiveKind .BOOLEAN )
185
176
186
177
override fun serialize (encoder : Encoder , value : CborBoolean ) {
187
- verify( encoder).encodeTags(value)
178
+ encoder.asCborEncoder( ).encodeTags(value)
188
179
encoder.encodeBoolean(value.boolean)
189
180
}
190
181
191
182
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()
194
185
if (element !is CborBoolean ) throw CborDecodingException (" Unexpected CBOR element, expected CborBoolean, had ${element::class } " )
195
186
return element
196
187
}
@@ -205,14 +196,14 @@ public object CborByteStringSerializer : KSerializer<CborByteString> {
205
196
PrimitiveSerialDescriptor (" kotlinx.serialization.cbor.CborByteString" , PrimitiveKind .STRING )
206
197
207
198
override fun serialize (encoder : Encoder , value : CborByteString ) {
208
- val cborEncoder = verify( encoder)
199
+ val cborEncoder = encoder.asCborEncoder( )
209
200
cborEncoder.encodeTags(value)
210
201
cborEncoder.encodeByteArray(value.bytes)
211
202
}
212
203
213
204
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()
216
207
if (element !is CborByteString ) throw CborDecodingException (" Unexpected CBOR element, expected CborByteString, had ${element::class } " )
217
208
return element
218
209
}
@@ -232,16 +223,13 @@ public object CborMapSerializer : KSerializer<CborMap> {
232
223
override val descriptor: SerialDescriptor = CborMapDescriptor
233
224
234
225
override fun serialize (encoder : Encoder , value : CborMap ) {
235
- verify(encoder)
236
226
val cborEncoder = encoder.asCborEncoder()
237
-
238
227
cborEncoder.encodeTags(value)
239
-
240
228
MapSerializer (CborElementSerializer , CborElementSerializer ).serialize(encoder, value)
241
229
}
242
230
243
231
override fun deserialize (decoder : Decoder ): CborMap {
244
- verify( decoder)
232
+ decoder.asCborDecoder( )
245
233
return CborMap (MapSerializer (CborElementSerializer , CborElementSerializer ).deserialize(decoder))
246
234
}
247
235
}
@@ -259,34 +247,25 @@ public object CborListSerializer : KSerializer<CborList> {
259
247
override val descriptor: SerialDescriptor = CborListDescriptor
260
248
261
249
override fun serialize (encoder : Encoder , value : CborList ) {
262
- verify(encoder)
263
250
val cborEncoder = encoder.asCborEncoder()
264
-
265
251
cborEncoder.encodeTags(value)
266
-
267
252
ListSerializer (CborElementSerializer ).serialize(encoder, value)
268
253
}
269
254
270
255
override fun deserialize (decoder : Decoder ): CborList {
271
- verify( decoder)
256
+ decoder.asCborDecoder( )
272
257
return CborList (ListSerializer (CborElementSerializer ).deserialize(decoder))
273
258
}
274
259
}
275
260
276
- private fun verify (encoder : Encoder ) =
277
- encoder.asCborEncoder()
278
-
279
-
280
- private fun verify (decoder : Decoder ) {
281
- decoder.asCborDecoder()
282
- }
283
261
284
262
internal fun Decoder.asCborDecoder (): CborDecoder = this as ? CborDecoder
285
263
? : throw IllegalStateException (
286
264
" This serializer can be used only with Cbor format." +
287
265
" Expected Decoder to be CborDecoder, got ${this ::class } "
288
266
)
289
267
268
+ /* need to expose writer to access encodeTag()*/
290
269
internal fun Encoder.asCborEncoder () = this as ? CborWriter
291
270
? : throw IllegalStateException (
292
271
" This serializer can be used only with Cbor format." +
@@ -313,4 +292,13 @@ private fun defer(deferred: () -> SerialDescriptor): SerialDescriptor = object :
313
292
override fun getElementAnnotations (index : Int ): List <Annotation > = original.getElementAnnotations(index)
314
293
override fun getElementDescriptor (index : Int ): SerialDescriptor = original.getElementDescriptor(index)
315
294
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
+
316
304
}
0 commit comments