2016-03-09 3 views
5

मैं की तरह सैसी सामान्य कोडेक वस्तु कुंजी के साथ रिकॉर्ड के लिए व्युत्पत्ति

object Claims { 
    import shapeless._ 
    import shapeless.labelled.FieldType 
    import io.circe._ 
    import io.circe.generic.semiauto._ 
    import java.util.UUID 

    type ClaimOf[V] = FieldOf[V] 
    object iss extends ClaimOf[String] 
    object subj extends ClaimOf[String] 
    object aud extends ClaimOf[Set[String]] 
    object client_id extends ClaimOf[UUID] 

    implicit val encoder = 
    deriveEncoder[FieldType[iss.type, String] :: FieldType[subj.type, String] :: HNil] 
} 

यह एक त्रुटि error: could not find implicit value for parameter encode: shapeless.Lazy[io.circe.generic.encoding.DerivedObjectEncoder[shapeless.::[shapeless.labelled.FieldType[Claims.iss.type,String],shapeless.::[shapeless.labelled.FieldType[Claims.subj.type,String],shapeless.HNil]]]] deriveEncoder[FieldType[iss.type, String] :: FieldType[subj.type, String] :: HNil]

उत्तर

3

Travis Brown लिए समस्या अनुसार के साथ संकलित नहीं है कुछ को लागू करने की कोशिश कर रहा हूँ "सामान्य है व्युत्पन्न को बेकार के सामान्य उदाहरणों के साथ काम करने के लिए डिज़ाइन किया गया है और फील्डटाइप कुंजी को प्रतीक होने की उम्मीद है। " See discussion on Gitter

मेरे समाधान:

object Claims { 
    import shapeless._ 
    import shapeless.labelled.FieldType 
    import io.circe._ 
    import io.circe.syntax._ 
    import io.circe.generic.semiauto._ 
    import io.circe.generic.encoding.DerivedObjectEncoder 
    import java.util.UUID 

    abstract case class ClaimOf[V](name: String) extends FieldOf[V] 

    object iss extends ClaimOf[String]("iss") 
    object subj extends ClaimOf[String]("subj") 
    object aud extends ClaimOf[Set[String]]("aud") 
    object client_id extends ClaimOf[UUID]("client_id") 

    implicit final def encodeClaims[K, H, T <: HList](implicit key: Witness.Aux[K], 
                 claim: K <:< ClaimOf[H], 
                 encodeHead: Lazy[Encoder[H]], 
                 encodeTail: Lazy[DerivedObjectEncoder[T]] 
                ): DerivedObjectEncoder[FieldType[K, H] :: T] = 
    new DerivedObjectEncoder[FieldType[K, H] :: T] { 
    final def encodeObject(a: FieldType[K, H] :: T): JsonObject = a match { 
     case h :: t => 
     (key.value.name -> encodeHead.value(h)) +: encodeTail.value.encodeObject(t) 
    } 
    } 

    val encoder = deriveEncoder[FieldType[iss.type, String] :: FieldType[subj.type, String] :: HNil] 

    val rec = (iss ->> "issuer") :: (subj ->> "subject") :: HNil 

    val json = rec.asJson.spaces2 
} 

encodeClaims समारोह मूल रूप से, circe से मूल कार्य की एक प्रति है कुंजी पर बाधा का स्थान लिया।

This answer का उपयोग किसी अन्य समाधान को लागू करने के लिए किया जा सकता है।

संबंधित मुद्दे