Skip to content

Instantly share code, notes, and snippets.

@vkostyukov
Created May 12, 2015 17:12
Show Gist options
  • Save vkostyukov/8e437949a39951b153d3 to your computer and use it in GitHub Desktop.
Save vkostyukov/8e437949a39951b153d3 to your computer and use it in GitHub Desktop.
Coproduct Routers in the Playground
package io.finch.playground
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.twitter.finagle.{Service, Filter, Httpx}
import com.twitter.util.{Future, Await}
import io.finch.{Endpoint => _, _}
import io.finch.micro._
import io.finch.request._
import io.finch.route.{Endpoint => _, _}
import io.finch.jackson._
/**
* GET /user/groups -> Seq[Group]
* POST /groups?name=foo -> Group
* PUT /user/groups/:group -> User
*/
object Main extends App {
// enable finch-jackson magic
implicit val objectMapper: ObjectMapper = new ObjectMapper().registerModule(DefaultScalaModule)
// model
case class Group(ownerId: Int = 0, name: String)
case class User(id: Int, groups: Seq[Group])
case class UnknownUser(id: Int) extends Exception(s"Unknown user with id=$id")
case object WrongSecret extends Exception("You shell not pass!")
val currentUser: RequestReader[User] =
header("X-Secrect").embedFlatMap {
case "open sesame" => User(0, Seq.empty[Group]).toFuture
case _ => WrongSecret.toFutureException
}
// GET /user/groups -> Seq[Group]
val getUserGroups: Router[RequestReader[Seq[Group]]] =
Get / "user" / "groups" /> (currentUser ~> { userId => Seq(Group(userId, "foo"), Group(userId, "bar")) })
// POST /groups?name=foo -> Group
val postGroup: Router[RequestReader[Group]] =
Post / "groups" /> (currentUser :: param("name")).as[Group]
// PUT /user/groups/:group -> User
val putUserGroup: Router[RequestReader[User]] =
Put / "user" / "groups" / string /> { group =>
currentUser ~> { User(_, Seq(group)) }
}
// an API endpoint
val api: Router[RequestReader[Seq[User]] :+: RequestReader[Group] :+: RequestReader[User] :+: CNil] =
getUserGroups :+: postGroup :+: putUserGroup
Await.ready(Httpx.serve(":8081", api))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment