5

I want to save a collection of FieldMapping classes as a json string -

abstract class Field {
  def clazz: Class[_]

  def name: String
}

case class StringField(name: String) extends Field {
  override def clazz: Class[_] = classOf[String]
}

case class DateField(name: String) extends Field {
  override def clazz: Class[_] = classOf[Date]
}

... etc - full code here: https://github.com/alexeyOnGitHub/scala-typesafe/blob/master/src/main/scala/com/example/model/Field.scala

Circe code:

import com.example.model.{DateField, Field, FieldMapping, StringField}
import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder}
import io.circe.{Decoder, Encoder}

object CirceBoilerplateForConfigs {
  implicit val fieldDecoder: Decoder[StringField] = deriveDecoder[StringField]
  implicit val fieldEncoder: Encoder[StringField] = deriveEncoder[StringField]

  implicit val dateDecoder: Decoder[DateField] = deriveDecoder[DateField]
  implicit val dateEncoder: Encoder[DateField] = deriveEncoder[DateField]

  implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping]
  implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping]
}

Error:(14, 65) could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[com.example.model.FieldMapping] implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping] Error:(14, 65)

not enough arguments for method deriveDecoder: (implicit decode: shapeless.Lazy[io.circe.generic.decoding.DerivedDecoder[com.example.model.FieldMapping]])io.circe.Decoder[com.example.model.FieldMapping]. Unspecified value parameter decode. implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping] Error:(15, 65)

could not find Lazy implicit value of type io.circe.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMapping] implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping] Error:(15, 65)

not enough arguments for method deriveEncoder: (implicit encode: shapeless.Lazy[io.circe.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMapping]])io.circe.ObjectEncoder[com.example.model.FieldMapping]. Unspecified value parameter encode. implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping]

Community
  • 1
  • 1
Alex
  • 2,589
  • 3
  • 35
  • 44
  • In your gist you didn't provide code for `GUser`. – Dmytro Mitin May 12 '18 at 17:21
  • `FieldMapping` is also not defined. – Dmytro Mitin May 12 '18 at 17:26
  • If I comment out `case class GUserField`, `def user`, `import com.example.model...`, `implicit val fooDecoder`, `implicit val fooEncoder` everything compiles. – Dmytro Mitin May 12 '18 at 17:28
  • here is the rest of the code - https://github.com/alexeyOnGitHub/scala-typesafe/tree/master/src/main/scala/com/example/model I need encoders/decoders for FieldMapping collections because this is what I want to convert to a json string – Alex May 13 '18 at 00:56
  • 1
    [How to create a Minimal, Complete, and Verifiable example](https://stackoverflow.com/help/mcve) – Dmytro Mitin May 13 '18 at 06:13

1 Answers1

4

Field should be a sealed trait (with abstract class or not sealed trait this won't work).

The following code compiles:

import java.util.Date

sealed trait Field {
  def clazz: Class[_]

  def name: String
}

case class StringField(name: String) extends Field {
  override def clazz: Class[_] = classOf[String]
}

case class DateField(name: String) extends Field {
  override def clazz: Class[_] = classOf[Date]
}

case class FieldMapping(fieldInConnector1: Option[Field],
                        fieldInConnector2: Option[Field],
                        selected: Boolean,
                        defaultValue: String)

import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder}
import io.circe.{Decoder, Encoder}
object CirceBoilerplateForConfigs {
  implicit val stringDecoder: Decoder[StringField] = deriveDecoder[StringField]
  implicit val stringEncoder: Encoder[StringField] = deriveEncoder[StringField]

  implicit val dateDecoder: Decoder[DateField] = deriveDecoder[DateField]
  implicit val dateEncoder: Encoder[DateField] = deriveEncoder[DateField]

  implicit val fieldDecoder: Decoder[Field] = deriveDecoder[Field]
  implicit val fieldEncoder: Encoder[Field] = deriveEncoder[Field]

  implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping]
  implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping]
}
Dmytro Mitin
  • 48,194
  • 3
  • 28
  • 66