Skip to content

Commit b60fe6b

Browse files
committed
ConfigCompanion - add java.time config codecs
1 parent 24c80dc commit b60fe6b

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

hocon/src/main/scala/com/avsystem/commons/hocon/ConfigCompanion.scala

+13
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ import com.avsystem.commons.serialization.GenCodec.ReadFailure
66
import com.avsystem.commons.serialization.{GenCodec, GenKeyCodec, GenObjectCodec}
77
import com.typesafe.config.{Config, ConfigFactory, ConfigObject}
88

9+
import java.time.{Period, Duration as JDuration}
910
import scala.concurrent.duration.*
1011

1112
trait HoconGenCodecs {
1213
implicit def configCodec: GenCodec[Config] = HoconGenCodecs.ConfigCodec
1314
implicit def finiteDurationCodec: GenCodec[FiniteDuration] = HoconGenCodecs.FiniteDurationCodec
15+
implicit def jDurationCodec: GenCodec[JDuration] = HoconGenCodecs.JavaDurationCodec
16+
implicit def periodCodec: GenCodec[Period] = HoconGenCodecs.PeriodCodec
1417
implicit def sizeInBytesCodec: GenCodec[SizeInBytes] = HoconGenCodecs.SizeInBytesCodec
1518
implicit def classKeyCodec: GenKeyCodec[Class[?]] = HoconGenCodecs.ClassKeyCodec
1619
implicit def classCodec: GenCodec[Class[?]] = HoconGenCodecs.ClassCodec
@@ -33,6 +36,16 @@ object HoconGenCodecs {
3336
(output, value) => output.writeSimple().writeLong(value.toMillis),
3437
)
3538

39+
implicit val JavaDurationCodec: GenCodec[JDuration] = GenCodec.nullable(
40+
input => input.readCustom(DurationMarker).getOrElse(JDuration.ofMillis(input.readSimple().readLong())),
41+
(output, value) => output.writeSimple().writeLong(value.toMillis),
42+
)
43+
44+
implicit final val PeriodCodec: GenCodec[Period] = GenCodec.nullable(
45+
input => input.readCustom(PeriodMarker).getOrElse(Period.parse(input.readSimple().readString())),
46+
(output, value) => output.writeSimple().writeString(value.toString),
47+
)
48+
3649
implicit final val SizeInBytesCodec: GenCodec[SizeInBytes] = GenCodec.nonNull(
3750
input => SizeInBytes(input.readCustom(SizeInBytesMarker).getOrElse(input.readSimple().readLong())),
3851
(output, value) => output.writeSimple().writeLong(value.bytes),

hocon/src/test/scala/com/avsystem/commons/hocon/HoconInputTest.scala

+8-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ import scala.concurrent.duration.*
1111
object HoconInputTest {
1212
case class CustomCodecsClass(
1313
duration: FiniteDuration,
14+
jDuration: Duration,
1415
fileSize: SizeInBytes,
1516
embeddedConfig: Config,
17+
period: Period,
1618
clazz: Class[?],
1719
clazzMap: Map[Class[?], String],
1820
)
@@ -76,22 +78,26 @@ class HoconInputTest extends GenCodecRoundtripTest {
7678
val config = ConfigFactory.parseString(
7779
"""{
7880
| duration = 1m
81+
| jDuration = 5m
7982
| fileSize = 1KiB
8083
| embeddedConfig {
8184
| something = "abc"
8285
| }
83-
| clazz = "com.avsystem.commons.hocon.HoconInputTest",
86+
| period = "7d"
87+
| clazz = "com.avsystem.commons.hocon.HoconInputTest"
8488
| clazzMap {
8589
| "com.avsystem.commons.hocon.HoconInputTest" = "abc"
8690
| }
8791
|}""".stripMargin
8892
)
8993
val expected = CustomCodecsClass(
9094
duration = 1.minute,
95+
jDuration = Duration.ofMinutes(5),
9196
fileSize = SizeInBytes.`1KiB`,
9297
embeddedConfig = ConfigFactory.parseMap(JMap("something" -> "abc")),
98+
period = Period.ofDays(7),
9399
clazz = classOf[HoconInputTest],
94-
clazzMap = Map(classOf[HoconInputTest] -> "abc")
100+
clazzMap = Map(classOf[HoconInputTest] -> "abc"),
95101
)
96102
assert(CustomCodecsClass.read(config) == expected)
97103
}

0 commit comments

Comments
 (0)