<lambda>null1 package kotlinx.serialization.hocon.internal
2 
3 import com.typesafe.config.*
4 import java.time.Duration as JDuration
5 import kotlin.time.Duration
6 import kotlinx.serialization.*
7 import kotlinx.serialization.builtins.serializer
8 import kotlinx.serialization.descriptors.SerialDescriptor
9 
10 /**
11  * Encode [Duration] objects using time unit short names: d, h, m, s, ms, us, ns.
12  * Example:
13  *     120.seconds -> 2 m;
14  *     121.seconds -> 121 s;
15  *     120.minutes -> 2 h;
16  *     122.minutes -> 122 m;
17  *     24.hours -> 1 d.
18  * Encoding uses the largest time unit.
19  * All restrictions on the maximum and minimum duration are specified in [Duration].
20  * @return encoded value
21  */
22 internal fun encodeDuration(value: Duration): String = value.toComponents { seconds, nanoseconds ->
23     when {
24         nanoseconds == 0 -> {
25             if (seconds % 60 == 0L) { // minutes
26                 if (seconds % 3600 == 0L) { // hours
27                     if (seconds % 86400 == 0L) { // days
28                         "${seconds / 86400} d"
29                     } else {
30                         "${seconds / 3600} h"
31                     }
32                 } else {
33                     "${seconds / 60} m"
34                 }
35             } else {
36                 "$seconds s"
37             }
38         }
39         nanoseconds % 1_000_000 == 0 -> "${seconds * 1_000 + nanoseconds / 1_000_000} ms"
40         nanoseconds % 1_000 == 0 -> "${seconds * 1_000_000 + nanoseconds / 1_000} us"
41         else -> "${value.inWholeNanoseconds} ns"
42     }
43 }
44 
45 /**
46  * Decode [JDuration] from [Config].
47  * See https://github.com/lightbend/config/blob/main/HOCON.md#duration-format
48  *
49  * @param path in config
50  */
51 @SuppressAnimalSniffer
decodeJavaDurationnull52 internal fun Config.decodeJavaDuration(path: String): JDuration = try {
53     getDuration(path)
54 } catch (e: ConfigException) {
55     throw SerializationException("Value at $path cannot be read as Duration because it is not a valid HOCON duration value", e)
56 }
57 
58 /**
59  * Returns `true` if this descriptor is equals to descriptor in [kotlinx.serialization.internal.DurationSerializer].
60  */
61 internal val SerialDescriptor.isDuration: Boolean
62     get() = this == Duration.serializer().descriptor
63