Skip to content

Commit 004dd1d

Browse files
committed
add CborEncoder.encoderCborElement
1 parent 89d671c commit 004dd1d

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

formats/cbor/api/kotlinx-serialization-cbor.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,13 @@ public final class kotlinx/serialization/cbor/CborElement$Companion {
114114
}
115115

116116
public abstract interface class kotlinx/serialization/cbor/CborEncoder : kotlinx/serialization/encoding/Encoder {
117+
public fun encodeCborElement (Lkotlinx/serialization/cbor/CborElement;)V
117118
public abstract fun getCbor ()Lkotlinx/serialization/cbor/Cbor;
118119
}
119120

120121
public final class kotlinx/serialization/cbor/CborEncoder$DefaultImpls {
121122
public static fun beginCollection (Lkotlinx/serialization/cbor/CborEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
123+
public static fun encodeCborElement (Lkotlinx/serialization/cbor/CborEncoder;Lkotlinx/serialization/cbor/CborElement;)V
122124
public static fun encodeNotNullMark (Lkotlinx/serialization/cbor/CborEncoder;)V
123125
public static fun encodeNullableSerializableValue (Lkotlinx/serialization/cbor/CborEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
124126
public static fun encodeSerializableValue (Lkotlinx/serialization/cbor/CborEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V

formats/cbor/api/kotlinx-serialization-cbor.klib.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ abstract interface kotlinx.serialization.cbor/CborDecoder : kotlinx.serializatio
5252
abstract interface kotlinx.serialization.cbor/CborEncoder : kotlinx.serialization.encoding/Encoder { // kotlinx.serialization.cbor/CborEncoder|null[0]
5353
abstract val cbor // kotlinx.serialization.cbor/CborEncoder.cbor|{}cbor[0]
5454
abstract fun <get-cbor>(): kotlinx.serialization.cbor/Cbor // kotlinx.serialization.cbor/CborEncoder.cbor.<get-cbor>|<get-cbor>(){}[0]
55+
56+
open fun encodeCborElement(kotlinx.serialization.cbor/CborElement) // kotlinx.serialization.cbor/CborEncoder.encodeCborElement|encodeCborElement(kotlinx.serialization.cbor.CborElement){}[0]
5557
}
5658

5759
final class kotlinx.serialization.cbor/CborBoolean : kotlinx.serialization.cbor/CborPrimitive<kotlin/Boolean> { // kotlinx.serialization.cbor/CborBoolean|null[0]

formats/cbor/commonMain/src/kotlinx/serialization/cbor/CborElement.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import kotlinx.serialization.cbor.internal.*
2121
* The whole hierarchy is [serializable][Serializable] only by [Cbor] format.
2222
*/
2323
@Serializable(with = CborElementSerializer::class)
24+
@ExperimentalSerializationApi
2425
public sealed class CborElement(
2526
/**
2627
* CBOR tags associated with this element.
@@ -60,6 +61,7 @@ public sealed class CborElement(
6061
* CBOR primitives include numbers, strings, booleans, byte arrays and special null value [CborNull].
6162
*/
6263
@Serializable(with = CborPrimitiveSerializer::class)
64+
@ExperimentalSerializationApi
6365
public sealed class CborPrimitive<T : Any>(
6466
public val value: T,
6567
tags: ULongArray = ulongArrayOf()
@@ -96,6 +98,7 @@ public sealed class CborPrimitive<T : Any>(
9698
* depending on the value of [sign]. Note that [absoluteValue] **must** be `0` when sign is set to [Sign.ZERO]
9799
*/
98100
@Serializable(with = CborIntSerializer::class)
101+
@ExperimentalSerializationApi
99102
public class CborInt(
100103
absoluteValue: ULong,
101104
public val sign: Sign,
@@ -179,6 +182,7 @@ public class CborInt(
179182
* Class representing CBOR floating point value (major type 7).
180183
*/
181184
@Serializable(with = CborFloatSerializer::class)
185+
@ExperimentalSerializationApi
182186
public class CborFloat(
183187
value: Double,
184188
vararg tags: ULong
@@ -188,6 +192,7 @@ public class CborFloat(
188192
* Class representing CBOR string value.
189193
*/
190194
@Serializable(with = CborStringSerializer::class)
195+
@ExperimentalSerializationApi
191196
public class CborString(
192197
value: String,
193198
vararg tags: ULong
@@ -197,6 +202,7 @@ public class CborString(
197202
* Class representing CBOR boolean value.
198203
*/
199204
@Serializable(with = CborBooleanSerializer::class)
205+
@ExperimentalSerializationApi
200206
public class CborBoolean(
201207
value: Boolean,
202208
vararg tags: ULong
@@ -206,6 +212,7 @@ public class CborBoolean(
206212
* Class representing CBOR byte string value.
207213
*/
208214
@Serializable(with = CborByteStringSerializer::class)
215+
@ExperimentalSerializationApi
209216
public class CborByteString(
210217
value: ByteArray,
211218
vararg tags: ULong
@@ -235,6 +242,7 @@ public class CborByteString(
235242
* Class representing CBOR `null` value
236243
*/
237244
@Serializable(with = CborNullSerializer::class)
245+
@ExperimentalSerializationApi
238246
public class CborNull(vararg tags: ULong) : CborPrimitive<Unit>(Unit, tags)
239247

240248
/**
@@ -244,6 +252,7 @@ public class CborNull(vararg tags: ULong) : CborPrimitive<Unit>(Unit, tags)
244252
* traditional methods like [Map.get] or [Map.getValue] to obtain CBOR elements.
245253
*/
246254
@Serializable(with = CborMapSerializer::class)
255+
@ExperimentalSerializationApi
247256
public class CborMap(
248257
private val content: Map<CborElement, CborElement>,
249258
vararg tags: ULong
@@ -270,6 +279,7 @@ public class CborMap(
270279
* traditional methods like [List.get] or [List.size] to obtain CBOR elements.
271280
*/
272281
@Serializable(with = CborListSerializer::class)
282+
@ExperimentalSerializationApi
273283
public class CborList(
274284
private val content: List<CborElement>,
275285
vararg tags: ULong

formats/cbor/commonMain/src/kotlinx/serialization/cbor/CborEncoder.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package kotlinx.serialization.cbor
66

77
import kotlinx.serialization.*
8+
import kotlinx.serialization.cbor.internal.CborElementSerializer
89
import kotlinx.serialization.encoding.*
910

1011
/**
@@ -31,4 +32,33 @@ public interface CborEncoder : Encoder {
3132
* Exposes the current [Cbor] instance and all its configuration flags. Useful for low-level custom serializers.
3233
*/
3334
public val cbor: Cbor
35+
/**
36+
* Appends the given CBOR [element] to the current output.
37+
* This method is allowed to invoke only as the part of the whole serialization process of the class,
38+
* calling this method after invoking [beginStructure] or any `encode*` method will lead to unspecified behaviour
39+
* and may produce an invalid CBOR result.
40+
* For example:
41+
* ```
42+
* class Holder(val value: Int, val list: List<Int>())
43+
*
44+
* // Holder serialize method
45+
* fun serialize(encoder: Encoder, value: Holder) {
46+
* // Completely okay, the whole Holder object is read
47+
* val cborObject = CborMap(...) // build a CborMap from Holder
48+
* (encoder as CborEncoder).encodeCborElement(cborObject) // Write it
49+
* }
50+
*
51+
* // Incorrect Holder serialize method
52+
* fun serialize(encoder: Encoder, value: Holder) {
53+
* val composite = encoder.beginStructure(descriptor)
54+
* composite.encodeSerializableElement(descriptor, 0, Int.serializer(), value.value)
55+
* val array = CborList(value.list.map { CborInt(it.toLong()) })
56+
* // Incorrect, encoder is already in an intermediate state after encodeSerializableElement
57+
* (composite as CborEncoder).encodeCborElement(array)
58+
* composite.endStructure(descriptor)
59+
* // ...
60+
* }
61+
* ```
62+
*/
63+
public fun encodeCborElement(element: CborElement): Unit = encodeSerializableValue(CborElementSerializer, element)
3464
}

formats/cbor/commonTest/src/kotlinx/serialization/cbor/CborElementTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,11 @@ class CborElementTest {
180180
)
181181
)
182182
val mapBytes = cbor.encodeToByteArray(mapElement)
183+
184+
val output = ByteArrayOutput()
185+
IndefiniteLengthCborWriter(cbor, output).encodeCborElement(mapElement)
186+
assertEquals(mapBytes.toHexString(),output.toByteArray().toHexString() )
187+
183188
val decodedMap = cbor.decodeFromByteArray<CborElement>(mapBytes)
184189

185190
// Verify the type and size

0 commit comments

Comments
 (0)