Это ваша ошибка:
implicit val columnTypeDecoder: Decoder[AttributeType] = deriveConfiguredDecoder
implicit val columnTypeEncoder: Encoder[AttributeType] = deriveConfiguredEncoder
Это приведет к получению новых кодеков, рассматривая AttributeType
как любую другую запечатанную черту, поэтому он будет использовать значение дискриминации (полуавтоматический режим всегда игнорирует существующие кодеки того типа, который они являются производными!).
Итак, вы создаете новые AttributeType
кодеки, помещаете их в область, в которой они используются, и таким образом делаете эти новые реализации более приоритетными, чем те, которые получены из сопутствующего объекта. Более близкое неявное всегда побеждает.
Если вы не будете выводить кодеки (потому что уже существуют реализации, предоставляемые чертой CirceEnum
), тогда он будет работать так, как вы ожидаете. делая это:
implicit val columnMetaDecoder: Decoder[ColumnMetadata] = deriveConfiguredDecoder
implicit val columnMetaEncoder: Encoder[ColumnMetadata] = deriveConfiguredEncoder
вы можете просто сделать это:
// make sure that Configuration is in scope by e.g. importing it
// or putting it in package object in the same package as case class
@ConfiguredJsonCodec
case class ColumnMetadata(name: String,
displayName: String,
description: Option[String],
attributeType: AttributeType)
Это избавит вас от усилий по созданию пакета кодеков и их ручному импорту везде, где они вам нужны. Например,
// imports
package object models_package {
private[models_package] implicit val config: Configuration = Configuration.default.withSnakeCaseMemberNames
}
package models_package
// imports
@ConfiguredJsonCodec
case class ColumnMetadata(name: String,
displayName: String,
description: Option[String],
attributeType: AttributeType)
sealed trait AttributeType extends EnumEntry
object AttributeType extends Enum[AttributeType] with CirceEnum[AttributeType] {
val values: immutable.IndexedSeq[AttributeType] = findValues
case object Number extends AttributeType
case object Text extends AttributeType
case object Percentage extends AttributeType
}