<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