Skip to content

Commit c497453

Browse files
committed
Creating manual printer in KMP
1 parent 5c915b4 commit c497453

File tree

2 files changed

+28
-20
lines changed

2 files changed

+28
-20
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ allprojects {
2020

2121
allprojects {
2222
group = "io.exoquery"
23-
version = "3.0.0.D"
23+
version = "3.0.0.E"
2424
}
2525

2626
subprojects {

pprint-kotlin-kmp/src/commonMain/kotlin/io/exoquery/kmp/pprint/PPrinter.kt

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,33 @@ import kotlinx.serialization.encoding.Encoder
1212
import kotlinx.serialization.modules.SerializersModule
1313
import kotlinx.serialization.serializer
1414

15-
open class PPrinter<T>(open val serializer: SerializationStrategy<T>, override open val config: PPrinterConfig = PPrinterConfig()): PPrinterBase<T>(config) {
15+
abstract class PPrinterKmp<T>(override open val config: PPrinterConfig): PPrinterBase<T>(config) {
16+
open fun <R> treeifyValueOrNull(value: R, elementName: String?, escapeUnicode: Boolean, showFieldNames: Boolean): Tree? =
17+
when {
18+
value == null -> Tree.Literal("null", elementName)
19+
value is Boolean -> Tree.Literal(value.toString(), elementName)
20+
value is Byte -> Tree.Literal(value.toString(), elementName)
21+
value is Short -> Tree.Literal(value.toString(), elementName)
22+
value is Int -> Tree.Literal(value.toString(), elementName)
23+
value is Long -> Tree.Literal("${value}L", elementName)
24+
value is Float -> Tree.Literal("${value}F", elementName)
25+
value is Double -> Tree.Literal(value.toString(), elementName)
26+
value is Char -> EncodeHelperImpl.encodeChar(value, escapeUnicode, elementName)
27+
value is String -> EncodeHelperImpl.encodeString(value, escapeUnicode, elementName)
28+
// Empty iterator case which for some reason causes an exception with the regular kotlin serializer
29+
value is Iterator<*> && !value.hasNext() -> Tree.Literal("empty iterator", elementName)
30+
value is Iterator<*> && value.hasNext() -> Tree.Literal("non-empty iterator", elementName)
31+
else -> null
32+
}
33+
}
34+
35+
open class PPrinterManual<T>(override val config: PPrinterConfig = PPrinterConfig()): PPrinterKmp<T>(config) {
36+
override fun treeify(x: T, elementName: String?, escapeUnicode: Boolean, showFieldNames: Boolean): Tree =
37+
treeifyValueOrNull(x, elementName, escapeUnicode, showFieldNames)
38+
?: Tree.Literal(x.toString(), elementName)
39+
}
40+
41+
open class PPrinter<T>(open val serializer: SerializationStrategy<T>, override open val config: PPrinterConfig = PPrinterConfig()): PPrinterKmp<T>(config) {
1642

1743
companion object {
1844
inline operator fun <reified T> invoke(config: PPrinterConfig = PPrinterConfig()) = PPrinter(serializer<T>(), config)
@@ -76,24 +102,6 @@ open class PPrinter<T>(open val serializer: SerializationStrategy<T>, override o
76102
Tree.Literal(treeifyable.value.toString(), elementName)
77103
}
78104
}
79-
80-
open fun <R> treeifyValueOrNull(value: R, elementName: String?, escapeUnicode: Boolean, showFieldNames: Boolean): Tree? =
81-
when {
82-
value == null -> Tree.Literal("null", elementName)
83-
value is Boolean -> Tree.Literal(value.toString(), elementName)
84-
value is Byte -> Tree.Literal(value.toString(), elementName)
85-
value is Short -> Tree.Literal(value.toString(), elementName)
86-
value is Int -> Tree.Literal(value.toString(), elementName)
87-
value is Long -> Tree.Literal("${value}L", elementName)
88-
value is Float -> Tree.Literal("${value}F", elementName)
89-
value is Double -> Tree.Literal(value.toString(), elementName)
90-
value is Char -> EncodeHelperImpl.encodeChar(value, escapeUnicode, elementName)
91-
value is String -> EncodeHelperImpl.encodeString(value, escapeUnicode, elementName)
92-
// Empty iterator case which for some reason causes an exception with the regular kotlin serializer
93-
value is Iterator<*> && !value.hasNext() -> Tree.Literal("empty iterator", elementName)
94-
value is Iterator<*> && value.hasNext() -> Tree.Literal("non-empty iterator", elementName)
95-
else -> null
96-
}
97105
}
98106

99107
class PPrintSequenceSerializer<T>(val element: KSerializer<T>) : KSerializer<Sequence<T>> {

0 commit comments

Comments
 (0)