5
5
package kotlinx.serialization.hocon
6
6
7
7
import com.typesafe.config.*
8
+ import kotlin.time.*
8
9
import kotlinx.serialization.*
10
+ import kotlinx.serialization.builtins.serializer
9
11
import kotlinx.serialization.descriptors.*
10
12
import kotlinx.serialization.encoding.*
11
13
import kotlinx.serialization.internal.*
@@ -42,17 +44,18 @@ internal abstract class AbstractHoconEncoder(
42
44
override fun shouldEncodeElementDefault (descriptor : SerialDescriptor , index : Int ): Boolean = hocon.encodeDefaults
43
45
44
46
override fun <T > encodeSerializableValue (serializer : SerializationStrategy <T >, value : T ) {
45
- if (serializer !is AbstractPolymorphicSerializer <* > || hocon.useArrayPolymorphism) {
46
- serializer.serialize(this , value)
47
- return
47
+ when {
48
+ serializer.descriptor == Duration .serializer().descriptor -> encodeDuration(value as Duration )
49
+ serializer !is AbstractPolymorphicSerializer <* > || hocon.useArrayPolymorphism -> serializer.serialize(this , value)
50
+ else -> {
51
+ @Suppress(" UNCHECKED_CAST" )
52
+ val casted = serializer as AbstractPolymorphicSerializer <Any >
53
+ val actualSerializer = casted.findPolymorphicSerializer(this , value as Any )
54
+ writeDiscriminator = true
55
+
56
+ actualSerializer.serialize(this , value)
57
+ }
48
58
}
49
-
50
- @Suppress(" UNCHECKED_CAST" )
51
- val casted = serializer as AbstractPolymorphicSerializer <Any >
52
- val actualSerializer = casted.findPolymorphicSerializer(this , value as Any )
53
- writeDiscriminator = true
54
-
55
- actualSerializer.serialize(this , value)
56
59
}
57
60
58
61
override fun beginStructure (descriptor : SerialDescriptor ): CompositeEncoder {
@@ -79,6 +82,32 @@ internal abstract class AbstractHoconEncoder(
79
82
}
80
83
81
84
private fun configValueOf (value : Any? ) = ConfigValueFactory .fromAnyRef(value)
85
+
86
+ private fun encodeDuration (value : Duration ) {
87
+ val result = value.toComponents { seconds, nanoseconds ->
88
+ when {
89
+ nanoseconds == 0 -> {
90
+ if (seconds % 60 == 0L ) { // minutes
91
+ if (seconds % 3600 == 0L ) { // hours
92
+ if (seconds % 86400 == 0L ) { // days
93
+ " ${seconds / 86400 } d"
94
+ } else {
95
+ " ${seconds / 3600 } h"
96
+ }
97
+ } else {
98
+ " ${seconds / 60 } m"
99
+ }
100
+ } else {
101
+ " $seconds s"
102
+ }
103
+ }
104
+ nanoseconds % 1_000_000 == 0 -> " ${seconds * 1_000 + nanoseconds / 1_000_000 } ms"
105
+ nanoseconds % 1_000 == 0 -> " ${seconds * 1_000_000 + nanoseconds / 1_000 } us"
106
+ else -> " ${value.inWholeNanoseconds} ns"
107
+ }
108
+ }
109
+ encodeString(result)
110
+ }
82
111
}
83
112
84
113
@ExperimentalSerializationApi
0 commit comments