Вам не нужен пользовательский код c. Вам нужно только сконфигурировать производный код c, используя circe-generi c -extras .
Так дано:
val configInfo =
"""{
"car": {
"requesters": {
"request1": "key1",
"request2": "key2"
},
"provider": {
"request1": "key3",
"request2": "key4"
}
},
"truck": {
"requesters": {
"request1": "key2",
"request2": "key3"
},
"provider": {
"request1": "key2",
"request2": "key3"
}
},
"blah": {
"requesters": {
"request1": "key2"
}
}
}"""
Вы можете:
import io.circe.Decoder
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.semiauto.deriveConfiguredDecoder
final case class TenantSettings(requesters: Map[String, String], provider: Map[String, String] = Map.empty)
object TentantSettings {
private implicit final val customConfig: Configuration = Configuration.default.withDefaults
implicit final val TenantSettingsDecoder: Decoder[TenantSettings] = deriveConfiguredDecoder
}
А затем:
io.circe.parser.decode[Map[String, TenantSettings]](configInfo)
// res: Either[io.circe.Error, Map[String, TenantSettings]] = Right(
// Map(
// "car" -> TenantSettings(Map("request1" -> "key1", "request2" -> "key2"), Map("request1" -> "key3", "request2" -> "key4")),
// "truck" -> TenantSettings(Map("request1" -> "key2", "request2" -> "key3"), Map("request1" -> "key2", "request2" -> "key3")),
// "blah" -> TenantSettings(Map("request1" -> "key2"), Map())
// )
// )