I have a simple type hierarchy like the following:
sealed abstract class Config
object Config {
case class Valid(name: String, traits: List[String]) extends Config
case class Invalid(error: String) extends Config
}
implicit val validFormat = jsonFormatFor(Config.Valid)
implicit val invalidFormat = jsonFormatFor(Config.Invalid)
I also have client code that does the following:
newHttpServer().addHandler("/config", extractConfig)
The extractConfig
method performs some computations and returns either a Config.Valid
or a Config.Invalid
, which the server will automatically convert to json by using the implicit json format objects. My problem is that there is a compiler error because extractConfig
returns a Config
:
type mismatch; found : Config
required: spray.httpx.marshalling.ToResponseMarshallable
If I change the return type of extractConfig
to Config.Valid
then the server code compiles because jsonFormatFor(...)
supplies the necessary automatic type conversion to make the respose a ToResponseMarshaller
(though I admit I don't fully understand this automatic conversion as well, being somewhat new to scala). Is there a simple way to solve this by declaring that any subclass of Config
must be a ToResponseMarshaller
, given that ToResponseMarshaller
is a trait that seems to be supplied via implicit conversions?