Created
June 14, 2016 13:58
-
-
Save diversit/c54fede95f2cfc80e11d2d9ffc04a9c4 to your computer and use it in GitHub Desktop.
A Finatra test app to try our different ways of handling a Scalactic Or into a proper response
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.philips.flexc.player_runtime.rest | |
import com.twitter.finagle.http.{Request, Status} | |
import com.twitter.finatra.http.response.ResponseBuilder | |
import com.twitter.finatra.http.routing.HttpRouter | |
import com.twitter.finatra.http.{Controller, HttpServer} | |
import com.twitter.util.Future | |
import org.scalactic.{Bad, Good, Or} | |
/** | |
* A simple Finatra http server to try out different ways of creating a proper | |
* response out of a Scalactic Or so this common functionality can be abstracted | |
* from all controllers so the routes in the controllers stay simple and readable | |
* and to have all error handling code in a single place. | |
*/ | |
object TestApp extends HttpServer { | |
implicit class OrToJsonResponse[G, B](val or: Or[G, B]) extends AnyVal { | |
def build(responseStatus: Status)(implicit responseBuilder: ResponseBuilder) = or match { | |
case Good(result) => responseBuilder.status(responseStatus).json(result) | |
case Bad(error) => responseBuilder.internalServerError(error) | |
} | |
def ok(implicit responseBuilder: ResponseBuilder) = build(Status.Ok) | |
} | |
implicit class FutureOrToJsonResponse[G,B](val fOr: Future[Or[G, B]]) extends AnyVal { | |
def build(responseStatus: Status)(implicit responseBuilder: ResponseBuilder) = fOr.map { | |
case Good(result) => responseBuilder.status(responseStatus).json(result) | |
case Bad(error) => responseBuilder.internalServerError(error) | |
} | |
def ok(implicit responseBuilder: ResponseBuilder) = build(Status.Ok) | |
} | |
override protected def configureHttp(router: HttpRouter): Unit = { | |
router.add(new Controller { | |
implicit def resp = response | |
get("/test") { request: Request => | |
Future { | |
Good("Ok").orBad[Int].ok | |
} | |
} | |
get("/test2") { request: Request => | |
Future { | |
Good("2").orBad[Int] | |
}.ok | |
} | |
get("/bad") { request: Request => | |
Future { | |
Good[String].orBad("Error") | |
}.ok | |
} | |
}) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Kunnen we een Bad ook invloed laten hebben op de uiteindelijke Http response code? InternalServerError is te generiek en komt als het goed is zelden voor...
Verder lijkt het me wel een werkbare oplossing