<lambda>null1package 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 decodeJavaDurationnull52internal 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