如何为Scala 3枚举值实现无原型参数的通用Circe Decoder
为枚举单例类型实现无参数Circe Decoder推导
你可以借助Scala 3的内联特性和编译期类型推导,自动获取枚举单例实例,实现无参数的Decoder推导,无需手动传入prototype参数。
改进后的代码实现
import io.circe.* inline def deriveEnumValueDecoder[A]: Decoder[A] = // 编译期自动获取枚举单例实例 val enumInstance = summonInline[A] Decoder.decodeString.emap: str => if str == enumInstance.toString then Right(enumInstance) else Left(s"Invalid value: $str") val json = Json.obj("processStatus" -> Json.fromString("OK")) val jsonEnum = Json.fromString("OK") println("MyClass: " + json.as[MyClass]) println("MyEnum: " + jsonEnum.as[MyEnum.OK.type]) case class MyClass(processStatus: MyEnum.OK.type) enum MyEnum: case OK, NOK given Decoder[MyClass] = Decoder.derived given Decoder[MyEnum.OK.type] = deriveEnumValueDecoder // 无参调用达成
核心原理
- 编译期实例获取:对于枚举单例类型(如
MyEnum.OK.type),Scala编译器会自动将枚举case的单例实例与该类型绑定,summonInline[A]能在编译阶段直接提取这个实例,无需手动传入。 - 类型安全保障:整个推导逻辑在编译期完成,
enumInstance的类型必然与目标类型A完全匹配,不会出现运行期类型转换错误。
这种实现既简化了调用代码,又完整保留了你原有的解码校验逻辑。
内容的提问来源于stack exchange,提问作者pme
相关产品推荐
相关产品推荐

