Really excellent stuff Dave. I look forward to incorporating this stuff as soon as it appears.
Thanks. On Feb 4, 3:45 pm, David Pollak <feeder.of.the.be...@gmail.com> wrote: > Folks, > I'm been working on the updates to the ESME REST APIs. > > I've reduced the call cycle to something that looks like: > > 1. A request is dispatched based on the URL > 2. The target of the dispatch returns a Box[T] where T is the type of the > thing that will be calculated if it can be > 1. T might be Boolean, Int, User, etc. > 2. It's in a Box because it perhaps cannot be calculated (e.g., not > enough permissions, etc.) > 3. The Box can be a Failure or even a FailureParam. In the case of > FailureParam, the param is the HTTP return code > 3. The result is put in an IntermediateAnswer along with a function that > can convert from T to the expected HTTP response type (e.g., XML or JSON) > 4. The IntermediateAnswer is queried in order to build the actual > response. > > With a nice dose of implicit, the code becomes very clean: > > val dispatch: RetType = { > case Req("rest" :: "status" :: Nil, "", GetRequest) => status() > case Req("rest" :: "login" :: Nil, "", PostRequest) => login() > case Req("rest" :: "logout" :: Nil, "", GetRequest) => logout() > case Req("rest" :: "message" :: Nil, "", GetRequest) => getMsgs() > } > > And let's see some implementations: > def status() = User.currentUser ?~ "No Session" ~> 400 > > def logout() = { > User.logUserOut() > true > } > > In status(), if there's no user logged in, we create a "No Session" error > message and return a 400. > > In logout(), we just return true. > > Now, the implicit magic comes from: > implicit def boolToResp(v: Boolean, t: RequestedResponse): LiftResponse = > (v, t) match { > case (v, XMLReqResponse) => new XmlResponse(<resp answer={v.toString}/>) > case (v, JSONReqResponse) => JSONResponse(v) > } > > implicit def userToResp(v: User, t: RequestedResponse): LiftResponse = (v, > t) match { > case (v, XMLReqResponse) => new XmlResponse(v.toXml) > case (v, JSONReqResponse) => JSONResponse(v.asJs) > } > > The code will automatically pick up these methods that convert from the > object type to the appropriate response type. One of these "views" must > exist for each type that is returned from a dispatched method. > > As I finish this stuff up, I'll roll it into some generic Lift classes. > > Thanks, > > David > > -- > Lift, the simply functional web frameworkhttp://liftweb.net > Beginning Scalahttp://www.apress.com/book/view/1430219890 > Follow me:http://twitter.com/dpp > Git some:http://github.com/dpp --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Lift" group. To post to this group, send email to liftweb@googlegroups.com To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/liftweb?hl=en -~----------~----~----~----~------~----~------~--~---