Как написать scode c code c для Коллекции Карт - PullRequest
1 голос
/ 23 марта 2020

У меня есть класс ниже

case class Foo(code: Int, msg: String, headers: Map[String,String] = Map.empty)

Ниже приведен код, который я пробовал до сих пор -

import scodec._
import scodec.codecs._

implicit val mapCodec: Codec[List[(String, String)]] = sizedList()

implicit val fooCodec : Codec[Foo] = {
    ("code" | int32) :: ("msg" | cstring) :: ("headers" | mapCodec)
}.as[Foo]

Я не знаю, как писать код c для Map[String, String]. Я проверил онлайн документацию, но она все еще находится в TODO.

Есть идеи, как написать код c для Map[String, String]?

1 Ответ

3 голосов
/ 23 марта 2020

Что вам нужно сделать, это определить 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]

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...