Come nuovo utente di SCodec, c'è una vera e propria curva di apprendimento. Ho avuto un problema che non riesco a risolvere nonostante abbia letto la fonte e i documenti.Appiattisci un codec arbitrariamente annidato?
Voglio essere in grado di definire i codec popolari come funzioni come questo
def packedByte : Codec[Int :: Int :: Int :: HNil] = uint(4) :: uint(2) :: uint(2)
E poi combinarle in per codec di livello superiore come questo, che decodifica per e codificare dalle classi caso come questo
case class MyPacket(foo : Boolean, first : Int, second : Int, third : Int, bar : Boolean)
def packet : Codec[MyPacket] = (bool :: packedByte :: bool).as[MyPacket]
Ma, questo non funziona dicendo
Potrebbe non dimostrare che shapeless.::[Boolean,shapeless.::[shap eless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.HNil]]] ,shapeless.::[Boolean ,shapeless.HNil]]] può essere convertito in/da cmd504.MyPacket .
Eppure, quando ho "in linea", il packedByte
, come
def packetInline : Codec[MyPacket] = (bool :: uint(4) :: uint(2) :: uint(2) :: bool).as[MyPacket]
Tutto compila e funziona come previsto. La mia intuizione mi dice che il Codec deve essere "appiattito" (basato sui due HNils nel messaggio di errore), ma non sono stato in grado di appiattire il Codec stesso o la rappresentazione HList interna.
come mai funziona senza ':: HNil' alla fine? –
@ Łukasz Vedi [questo metodo] (https://github.com/scodec/scodec/blob/v1.8.3/shared/src/main/scala/scodec/package.scala#L269) - è uno speciale operatore Scodec, non di Shapeless '::'. –
Va bene, grazie! Non lo sapevo. –