In one file, I have:
trait JsonSchema[T] { val propertyType: String override def toString: String = propertyType } object JsonSchema { implicit def stringSchema: JsonSchema[String] = new JsonSchema[String] { override val propertyType: String = "string" } implicit def intSchema: JsonSchema[Int] = new JsonSchema[Int] { override val propertyType: String = "integer" } implicit def booleanSchema: JsonSchema[Boolean] = new JsonSchema[Boolean] { override val propertyType: String = "boolean" } } In my main file:
case class MetaHolder[T](v: T)(implicit val meta: JsonSchema[T]) object JsonSchemaExample extends App { println(MetaHolder(3).meta.toString) println(MetaHolder("wow").meta.toString) } That works hunky-dory. Now suppose I do this instead:
case class MetaHolder[T](v: T) { val meta: JsonSchema[T] = implicitly[JsonSchema[T]] } It no longer compiles. Why?
My goal is to modify the anonymous Endpoint classes in the scala Finch library by adding a val meta to everything. I've been able to do this without any fancy-business so far, but now I want to do some fancy implicit resolution with shapeless to provide a JsonSchema definition for arbitrary case classes. My question is how to do this while maintaining backward compatibility. As in: provide the jsonschema meta feature for people who want to opt in, don't change the compilation burden for anyone who does not want to use meta,
If instead I go the first route, with an added implicit parameter, wouldn't that require a special import to be added by everyone? Or am I missing something and would backward compatibility still be maintained?
valsinstead ofdefs.