scalaslickscalatra

Working with futures in slick and scalatra


I am trying to handle a future I got from slick in order to generate a response to a request, but I'm stuck at the "async" part.

Here is a snippet:

get("/tmp") {
  new AsyncResult() {
    override val is: Future[_] = db.run(Users.findUserWithLogin("user"))
  }
}

Now, the db.run call returns a Future[Option[User]]. How do I returns a response depending on the content of the option?


Solution

  • In this case, you need to map the future returned by Slick to the result that you want rather than setting is directly to the Slick result. So, the following would be an example of how you might handle it:

    get("/tmp") {
      new AsyncResult() {
        val is = db.run(Users.findUserWithLogin("user")) map {
          case Some(u) => //return some stuff about the user
          case None => //return some stuff about user not being found
        }
      }
    }
    

    As noted in the comments below, the AsyncResult is not strictly necessary. You can find more details in the Scalatra documentation.