A Scala library for producing Siren entities from your domain model objects and serializing them to
application/vnd.siren+json. See the Siren Spec
This library is still very much a work-in-progress, so expect its API to change.
Currently the library supports Scala 2.10 and 2.11 versions.
#Setup
In order to use siren-scala library you must add resolver to bintray repository and library dependency.
##Resolvers
resolvers += "yetu Bintray Repo" at "http://dl.bintray.com/yetu/maven/"
##Library dependency
libraryDependencies += "com.yetu" %% "siren-scala" % "0.5.1"
#Usage
siren-scala provides a rich model of the types described in the Siren specification. The top-level
type is Entity.RootEntity, which represents a Siren root entity.
The whole Siren model available with the following import:
import com.yetu.siren.model._
Moreover, the library provides serialization of Siren root entities to JSON using either Spray-JSON or Play-JSON. Note that you need to explicitly add a dependency to either spray-json or play-json in your project, as siren-scala doesn't pull them into your project transitively.
Siren-Scala supports both converting from its model types to a JSON AST and the other way round, so that it can be used for implementing both a web API using Siren as well as a client for a Siren-based web API.
import com.yetu.siren.json.sprayjson.SirenJsonProtocol._
import spray.json._
val rootEntity: Entity.RootEntity = ...
rootEntity.toJson
val json: JsValue = ???
json.convertTo[Entity.RootEntity]
import com.yetu.siren.json.playjson.PlayJsonSirenFormat._
import play.api.libs.json._
val rootEntity: Entity.RootEntity = ...
Json.toJson(rootEntity)
val json: JsValue = ???
Json.fromJson[Entity.RootEntity](json)
In order to enable you to create Siren representations for your resources, siren-scala provides a
type class, SirenRootEntityWriter. Provide an instance of this type class for your case class, and
you will be able to easily convert instances of that case class to Siren root entities:
import com.yetu.siren
import siren.Siren
case class Person(name: String, age: Int)
implicit val personSirenWriter = new SirenRootEntityWriter[Person] {
override def toSiren(order: Order) = {
???
}
}
val personEntity: Entity.RootEntity = Siren.asRootEntity(Person("Bob", 31))
For a complete usage example, please see the ExampleSpec.scala.
Boris Malenšek, Daniel Westheide