2
사례 클래스에 대한 elasticsearch Json 매핑을 자동으로 생성하기 위해 자동 유형 클래스 파생을 작성했습니다. 그 때문에 TypeClass 형식 클래스를 셰이프에 사용하고 있습니다. 문제는 우리가 사용하는 사례 클래스의 많은 필드가 스칼라 열거 형이라는 것입니다. 예를 들어 스칼라 열거 필드가있는 사례 클래스의 자동 유형 클래스 파생
object ConnectionState extends Enumeration {
type ConnectionState = Value
val ordering, requested, pending, available, down, deleting, deleted, rejected = Value
}
또는
내가 자동 유도가 모두ConnectionState
을 위해 (예를 데리러 것을 위해 정의 된 모든 열거에 대한 특정 암시 인스턴스를 정의 할 필요가 보인다
object ProductCodeType extends Enumeration {
type ProductCodeType = Value
val devpay, marketplace = Value
}
및 ProductCodeType
). 모든 열거 유형에 대해 작동 할 수 열거 한 implicit def
같은
implicit def enumerationMapping: MappingEncoder[Enumeration] = new MappingEncoder[Enumeration] {
def toMapping = jSingleObject("type", jString("text"))
}
으로 내가 가질 수 없습니다. 형식 클래스를 공변수로 만들려고했지만 다른 것들은 아무 것도 도움이되지 않았습니다. 아이디어가 있으십니까?
object Mapping {
trait MappingEncoder[T] {
def toMapping: Json
}
object MappingEncoder extends LabelledProductTypeClassCompanion[MappingEncoder] {
implicit val stringMapping: MappingEncoder[String] = new MappingEncoder[String] {
def toMapping = jSingleObject("type", jString("text"))
}
implicit val intMapping: MappingEncoder[Int] = new MappingEncoder[Int] {
def toMapping = jSingleObject("type", jString("integer"))
}
implicit def seqMapping[T: MappingEncoder]: MappingEncoder[Seq[T]] = new MappingEncoder[Seq[T]] {
def toMapping = implicitly[MappingEncoder[T]].toMapping
}
implicit def optionMapping[T: MappingEncoder]: MappingEncoder[Option[T]] = new MappingEncoder[Option[T]] {
def toMapping = implicitly[MappingEncoder[T]].toMapping
}
object typeClass extends LabelledProductTypeClass[MappingEncoder] {
def emptyProduct = new MappingEncoder[HNil] {
def toMapping = jEmptyObject
}
def product[F, T <: HList](name: String, sh: MappingEncoder[F], st: MappingEncoder[T]) = new MappingEncoder[F :: T] {
def toMapping = {
val head = sh.toMapping
val tail = st.toMapping
(name := head) ->: tail
}
}
def project[F, G](instance: => MappingEncoder[G], to: F => G, from: G => F) = new MappingEncoder[F] {
def toMapping = jSingleObject("properties", instance.toMapping)
}
}
}
}