summaryrefslogtreecommitdiff
path: root/runtime/commonMain/src/kotlinx/serialization/SerialFormat.kt
blob: 534359588d5428e40bc6a98c1d5f285d8d4064b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*
 * Copyright 2017-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */

package kotlinx.serialization

import kotlinx.serialization.modules.SerialModule
import kotlinx.serialization.modules.plus
import kotlinx.serialization.internal.HexConverter

private const val INSTALL_DEPRECATION_TEXT = "Install is no longer supported, module can be added to format only in constructor"

interface SerialFormat {
    val context: SerialModule

    @Deprecated(INSTALL_DEPRECATION_TEXT, level = DeprecationLevel.ERROR)
    fun install(module: SerialModule) {}
}

abstract class AbstractSerialFormat(override val context: SerialModule): SerialFormat {
    @Suppress("DeprecatedCallableAddReplaceWith")
    @Deprecated(INSTALL_DEPRECATION_TEXT, level = DeprecationLevel.ERROR)
    final override fun install(module: SerialModule) {
        throw NotImplementedError(INSTALL_DEPRECATION_TEXT)
    }
}

interface BinaryFormat: SerialFormat {
    fun <T> dump(serializer: SerializationStrategy<T>, obj: T): ByteArray
    fun <T> load(deserializer: DeserializationStrategy<T>, bytes: ByteArray): T
}

fun <T> BinaryFormat.dumps(serializer: SerializationStrategy<T>, obj: T): String =
    HexConverter.printHexBinary(dump(serializer, obj), lowerCase = true)

fun <T> BinaryFormat.loads(deserializer: DeserializationStrategy<T>, hex: String): T =
    load(deserializer, HexConverter.parseHexBinary(hex))

interface StringFormat: SerialFormat {
    fun <T> stringify(serializer: SerializationStrategy<T>, obj: T): String
    fun <T> parse(deserializer: DeserializationStrategy<T>, string: String): T
}