<lambda>null1 package kotlinx.serialization.hocon.serializers
2
3 import java.time.Duration as JDuration
4 import kotlin.time.*
5 import kotlinx.serialization.*
6 import kotlinx.serialization.ExperimentalSerializationApi
7 import kotlinx.serialization.descriptors.*
8 import kotlinx.serialization.encoding.*
9 import kotlinx.serialization.hocon.*
10 import kotlinx.serialization.hocon.internal.*
11
12 /**
13 * Serializer for [java.time.Duration].
14 * All possible Hocon duration formats [https://github.com/lightbend/config/blob/main/HOCON.md#duration-format] are accepted for decoding.
15 * During encoding, the serializer emits values using time unit short names: d, h, m, s, ms, us, ns.
16 * The largest integer time unit is encoded.
17 * Example:
18 * 120.seconds -> 2 m;
19 * 121.seconds -> 121 s;
20 * 120.minutes -> 2 h;
21 * 122.minutes -> 122 m;
22 * 24.hours -> 1 d.
23 * When encoding, there is a conversion to [kotlin.time.Duration].
24 * All restrictions on the maximum and minimum duration are specified in [kotlin.time.Duration].
25 * Usage example:
26 * ```
27 * @Serializable
28 * data class ExampleDuration(
29 * @Serializable(JDurationSerializer::class)
30 * val duration: java.time.Duration
31 * )
32 * val config = ConfigFactory.parseString("duration = 1 day")
33 * val exampleDuration = Hocon.decodeFromConfig(ExampleDuration.serializer(), config)
34 * val newConfig = Hocon.encodeToConfig(ExampleDuration.serializer(), exampleDuration)
35 * ```
36 */
37 @ExperimentalSerializationApi
38 @SuppressAnimalSniffer
39 object JavaDurationSerializer : KSerializer<JDuration> {
40
41 override val descriptor: SerialDescriptor =
42 PrimitiveSerialDescriptor("hocon.java.time.Duration", PrimitiveKind.STRING)
43
44 override fun deserialize(decoder: Decoder): JDuration =
45 if (decoder is HoconDecoder) decoder.decodeConfigValue { conf, path -> conf.decodeJavaDuration(path) }
46 else throwUnsupportedFormatException("JavaDurationSerializer")
47
48 override fun serialize(encoder: Encoder, value: JDuration) {
49 if (encoder is HoconEncoder) encoder.encodeString(encodeDuration(value.toKotlinDuration()))
50 else throwUnsupportedFormatException("JavaDurationSerializer")
51 }
52 }
53