Skip to content

Commit 1d97928

Browse files
committed
pimp CborEncoder
1 parent aeb4c4c commit 1d97928

File tree

5 files changed

+36
-14
lines changed

5 files changed

+36
-14
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ public final class kotlinx/serialization/cbor/CborElement$Companion {
115115

116116
public abstract interface class kotlinx/serialization/cbor/CborEncoder : kotlinx/serialization/encoding/Encoder {
117117
public fun encodeCborElement (Lkotlinx/serialization/cbor/CborElement;)V
118+
public abstract fun encodeNegative-VKZWuLQ (J)V
119+
public abstract fun encodePositive-VKZWuLQ (J)V
120+
public abstract fun encodeTags-QwZRm1k ([J)V
118121
public abstract fun getCbor ()Lkotlinx/serialization/cbor/Cbor;
119122
}
120123

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ abstract interface kotlinx.serialization.cbor/CborEncoder : kotlinx.serializatio
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]
5555

56+
abstract fun encodeNegative(kotlin/ULong) // kotlinx.serialization.cbor/CborEncoder.encodeNegative|encodeNegative(kotlin.ULong){}[0]
57+
abstract fun encodePositive(kotlin/ULong) // kotlinx.serialization.cbor/CborEncoder.encodePositive|encodePositive(kotlin.ULong){}[0]
58+
abstract fun encodeTags(kotlin/ULongArray) // kotlinx.serialization.cbor/CborEncoder.encodeTags|encodeTags(kotlin.ULongArray){}[0]
5659
open fun encodeCborElement(kotlinx.serialization.cbor/CborElement) // kotlinx.serialization.cbor/CborEncoder.encodeCborElement|encodeCborElement(kotlinx.serialization.cbor.CborElement){}[0]
5760
}
5861

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ package kotlinx.serialization.cbor
66

77
import kotlinx.serialization.*
88
import kotlinx.serialization.cbor.internal.CborElementSerializer
9+
import kotlinx.serialization.cbor.internal.encodeNegative
10+
import kotlinx.serialization.cbor.internal.encodePositive
911
import kotlinx.serialization.encoding.*
1012

1113
/**
@@ -61,4 +63,19 @@ public interface CborEncoder : Encoder {
6163
* ```
6264
*/
6365
public fun encodeCborElement(element: CborElement): Unit = encodeSerializableValue(CborElementSerializer, element)
66+
67+
/**
68+
* Allows manually encoding CBOR tags. Use with caution, as it is possible to produce invalid CBOR if invoked carelessly!
69+
*/
70+
public fun encodeTags(@OptIn(kotlin.ExperimentalUnsignedTypes::class) tags: ULongArray): Unit
71+
72+
/**
73+
* Encode a negative value as [CborInt]. This function exists to encode negative values exceeding [Long.MIN_VALUE]
74+
*/
75+
public fun encodeNegative(value: ULong)
76+
77+
/**
78+
* Encode a positive value as [CborInt]. This function exists to encode negative values exceeding [Long.MAX_VALUE]
79+
*/
80+
public fun encodePositive(value: ULong)
6481
}

formats/cbor/commonMain/src/kotlinx/serialization/cbor/internal/CborElementSerializers.kt

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ internal object CborNullSerializer : KSerializer<CborNull>, CborSerializer {
8686

8787
override fun serialize(encoder: Encoder, value: CborNull) {
8888
val cborEncoder = encoder.asCborEncoder()
89-
cborEncoder.encodeTags(value)
89+
cborEncoder.encodeTags(value.tags)
9090
encoder.encodeNull()
9191
}
9292

@@ -108,7 +108,7 @@ internal object CborIntSerializer : KSerializer<CborInt>, CborSerializer {
108108

109109
override fun serialize(encoder: Encoder, value: CborInt) {
110110
val cborEncoder = encoder.asCborEncoder()
111-
cborEncoder.encodeTags(value)
111+
cborEncoder.encodeTags(value.tags)
112112
when (value.sign) {
113113
//@formatter:off
114114
CborInt.Sign.ZERO, CborInt.Sign.POSITIVE -> cborEncoder.encodePositive(value.value)
@@ -130,7 +130,7 @@ internal object CborFloatSerializer : KSerializer<CborFloat>, CborSerializer {
130130

131131
override fun serialize(encoder: Encoder, value: CborFloat) {
132132
val cborEncoder = encoder.asCborEncoder()
133-
cborEncoder.encodeTags(value)
133+
cborEncoder.encodeTags(value.tags)
134134
encoder.encodeDouble(value.value)
135135
}
136136

@@ -150,7 +150,7 @@ internal object CborStringSerializer : KSerializer<CborString>, CborSerializer {
150150

151151
override fun serialize(encoder: Encoder, value: CborString) {
152152
val cborEncoder = encoder.asCborEncoder()
153-
cborEncoder.encodeTags(value)
153+
cborEncoder.encodeTags(value.tags)
154154
encoder.encodeString(value.value)
155155
}
156156

@@ -172,7 +172,7 @@ internal object CborBooleanSerializer : KSerializer<CborBoolean>, CborSerializer
172172

173173
override fun serialize(encoder: Encoder, value: CborBoolean) {
174174
val cborEncoder = encoder.asCborEncoder()
175-
cborEncoder.encodeTags(value)
175+
cborEncoder.encodeTags(value.tags)
176176
encoder.encodeBoolean(value.value)
177177
}
178178

@@ -194,8 +194,9 @@ internal object CborByteStringSerializer : KSerializer<CborByteString>, CborSeri
194194

195195
override fun serialize(encoder: Encoder, value: CborByteString) {
196196
val cborEncoder = encoder.asCborEncoder()
197-
cborEncoder.encodeTags(value)
198-
cborEncoder.encodeByteString(value.value)
197+
cborEncoder.encodeTags(value.tags)
198+
//this we really don't want to expose so we cast here
199+
(cborEncoder as CborWriter).encodeByteString(value.value)
199200
}
200201

201202
override fun deserialize(decoder: Decoder): CborByteString {
@@ -221,7 +222,7 @@ internal object CborMapSerializer : KSerializer<CborMap>, CborSerializer {
221222

222223
override fun serialize(encoder: Encoder, value: CborMap) {
223224
val cborEncoder = encoder.asCborEncoder()
224-
cborEncoder.encodeTags(value)
225+
cborEncoder.encodeTags(value.tags)
225226
MapSerializer(CborElementSerializer, CborElementSerializer).serialize(encoder, value)
226227
}
227228

@@ -245,7 +246,7 @@ internal object CborListSerializer : KSerializer<CborList>, CborSerializer {
245246

246247
override fun serialize(encoder: Encoder, value: CborList) {
247248
val cborEncoder = encoder.asCborEncoder()
248-
cborEncoder.encodeTags(value)
249+
cborEncoder.encodeTags(value.tags)
249250
ListSerializer(CborElementSerializer).serialize(encoder, value)
250251
}
251252

@@ -263,7 +264,7 @@ internal fun Decoder.asCborDecoder(): CborDecoder = this as? CborDecoder
263264
)
264265

265266
/*need to expose writer to access encodeTag()*/
266-
internal fun Encoder.asCborEncoder() = this as? CborWriter
267+
internal fun Encoder.asCborEncoder() = this as? CborEncoder
267268
?: throw IllegalStateException(
268269
"This serializer can be used only with Cbor format." +
269270
"Expected Encoder to be CborEncoder, got ${this::class}"

formats/cbor/commonMain/src/kotlinx/serialization/cbor/internal/Encoder.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ internal sealed class CborWriter(
9999
override fun encodeLong(value: Long) {
100100
getDestination().encodeNumber(value)
101101
}
102-
internal open fun encodeNegative(value: ULong) = getDestination().encodeNegative(value)
103-
internal open fun encodePositive(value: ULong) = getDestination().encodePositive(value)
102+
override fun encodeNegative(value: ULong) = getDestination().encodeNegative(value)
103+
override fun encodePositive(value: ULong) = getDestination().encodePositive(value)
104104

105105
override fun encodeBoolean(value: Boolean) {
106106
getDestination().encodeBoolean(value)
@@ -148,8 +148,6 @@ internal sealed class CborWriter(
148148
incrementChildren() // needed for definite len encoding, NOOP for indefinite length encoding
149149
return true
150150
}
151-
152-
internal abstract fun encodeTags(tags: ULongArray)
153151
}
154152

155153

0 commit comments

Comments
 (0)