@@ -2,9 +2,14 @@ package com.eignex.kencode
22
33import PackedFormat
44import kotlinx.serialization.*
5- import kotlinx.serialization.modules.EmptySerializersModule
65import kotlinx.serialization.modules.SerializersModule
76
7+ data class EncodedConfiguration (
8+ val codec : ByteEncoding = Base62 ,
9+ val checksum : Checksum ? = null ,
10+ val binaryFormat : BinaryFormat = PackedFormat .Default
11+ )
12+
813/* *
914 * Text `StringFormat` that combines:
1015 *
@@ -25,30 +30,34 @@ import kotlinx.serialization.modules.SerializersModule
2530 */
2631@OptIn(ExperimentalSerializationApi ::class )
2732open class EncodedFormat (
28- val codec : ByteEncoding = Base62 ,
29- val checksum : Checksum ? = null ,
30- val binaryFormat : BinaryFormat = PackedFormat
33+ val configuration : EncodedConfiguration ,
3134) : StringFormat {
3235
36+ constructor (
37+ codec: ByteEncoding = Base62 ,
38+ checksum: Checksum ? = null ,
39+ binaryFormat: BinaryFormat = PackedFormat ,
40+ ) : this (EncodedConfiguration (codec, checksum, binaryFormat))
41+
42+ override val serializersModule: SerializersModule get() = configuration.binaryFormat.serializersModule
43+
3344 /* *
3445 * Default format: `PackedFormat` + `Base62` without checksum.
3546 */
3647 companion object Default : EncodedFormat()
3748
38- override val serializersModule: SerializersModule = EmptySerializersModule ()
39-
4049 /* *
4150 * Serializes [value] with [binaryFormat], optionally appends [checksum],
4251 * and encodes the result using [codec].
4352 */
4453 override fun <T > encodeToString (
4554 serializer : SerializationStrategy <T >, value : T
4655 ): String {
47- val bytes = binaryFormat.encodeToByteArray(serializer, value)
48- val checked = if (checksum != null ) {
49- bytes + checksum.digest(bytes)
56+ val bytes = configuration. binaryFormat.encodeToByteArray(serializer, value)
57+ val checked = if (configuration. checksum != null ) {
58+ bytes + configuration. checksum.digest(bytes)
5059 } else bytes
51- return codec.encode(checked)
60+ return configuration. codec.encode(checked)
5261 }
5362
5463 /* *
@@ -60,18 +69,40 @@ open class EncodedFormat(
6069 override fun <T > decodeFromString (
6170 deserializer : DeserializationStrategy <T >, string : String
6271 ): T {
63- val input = codec.decode(string)
64- val bytes = if (checksum != null ) {
65- require(input.size >= checksum.size)
66- val bytes = input.sliceArray(0 .. <input.size - checksum.size)
72+ val input = configuration. codec.decode(string)
73+ val bytes = if (configuration. checksum != null ) {
74+ require(input.size >= configuration. checksum.size)
75+ val bytes = input.sliceArray(0 .. <input.size - configuration. checksum.size)
6776 val actual =
68- input.sliceArray(input.size - checksum.size.. <input.size)
69- val expected = checksum.digest(bytes)
77+ input.sliceArray(input.size - configuration. checksum.size.. <input.size)
78+ val expected = configuration. checksum.digest(bytes)
7079 require(actual.contentEquals(expected)) {
7180 "Checksum mismatch."
7281 }
7382 bytes
7483 } else input
75- return binaryFormat.decodeFromByteArray(deserializer, bytes)
84+ return configuration. binaryFormat.decodeFromByteArray(deserializer, bytes)
7685 }
7786}
87+
88+ class EncodedFormatBuilder {
89+ var codec: ByteEncoding = Base62
90+ var checksum: Checksum ? = null
91+ var binaryFormat: BinaryFormat = PackedFormat .Default
92+ }
93+
94+ fun EncodedFormat (
95+ from: EncodedFormat = EncodedFormat .Default ,
96+ builderAction: EncodedFormatBuilder .() - > Unit
97+ ): EncodedFormat {
98+ val builder = EncodedFormatBuilder ().apply {
99+ codec = from.configuration.codec
100+ checksum = from.configuration.checksum
101+ binaryFormat = from.configuration.binaryFormat
102+ }
103+ builder.builderAction()
104+
105+ val newConfig = EncodedConfiguration (builder.codec, builder.checksum, builder.binaryFormat)
106+
107+ return EncodedFormat (newConfig)
108+ }
0 commit comments