2016-12-07 1 views
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) 
     } 
     } 
    } 
    } 

답변

0

I 스코프에 추가 암시 인증 된 정의를 추가함으로써이 문제를 해결할 수 있었다 :

implicit def enumerationMapping[T <: Enumeration#Value]: MappingEncoder[T] = new MappingEncoder[T] { 
    def toMapping = jSingleObject("type", jString("text")) 
} 
implicit def enumerationSeqMapping[T <: Enumeration#Value]: MappingEncoder[Seq[T]] = new MappingEncoder[Seq[T]] { 
    def toMapping = jSingleObject("type", jString("text")) 
} 

번째 내재 경우 클래스의 일부로서 필요로하고 여기

는 유도 코드 Seq [T] 타입의 멤버를 가졌다. 여기서 T는 어떤 열거 타입이다.

관련 문제