Что вам нужно сделать, это определить Codec
для набора строк, который затем вам нужно будет использовать для создания кода c для List[(String, String)]
, который можно преобразовать в Map[String, String]
и наоборот, следовательно, скрыть Codec
с использованием функции xmap
.
Таким образом, окончательное решение может выглядеть следующим образом:
import scodec._
import scodec.codecs._
case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)
implicit val tupleCodec : Codec[(String, String)] = cstring.pairedWith(cstring)
implicit val mapCodec: Codec[Map[String, String]] = list(tupleCodec).xmap(_.toMap, _.toList)
implicit val fooCodec : Codec[Foo] = {
("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]
Надеюсь, это поможет!