Andrew
Andrew

Reputation: 6394

Scala + Play Framework: Action composition explanation needed

This is the action composition taken from a sample that comes with the Play Framework

def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user =>
    Action(request => f(user)(request))
  }   

So, Security.Authenticated takes an username: RequestHeader => Option[String] and onAuthorized: RequestHeader=>SimpleResultand the second group of parantheses take String => Action[A]

And then in the controller I have:

def index = isAuthenticated { ...code }}  

The code above is this, so I assume this is the f function => String => Request[AnyContent] => Result. Now, what I don't understand is what really happens here. I am not talking about User.findByEmail...., I'm talking about username => _ => .... What would the signature of this function look like if I called it directly?

username => _ =>
    User.findByEmail(username).map { user =>
      Ok(
        html.dashboard(
          Project.findInvolving(username), 
          Task.findTodoInvolving(username), 
          user
        )
      )
    }.getOrElse(Forbidden)  

If there was def isAuthenticated(f: => Request[AnyContent] => Result) I'd know how to use it and I'd understand it. But the extra "data" is confusing me.

UPDATE:

I guess I found something:

def f2: String => Int => List[Char] = x => _ => x.toList  

And this would be called as:

f2("Andrew")(2) //there can be anything replacing 2 because I don't have access to it anyway  

So the function above that I asked primarily about would be:

def f: => String => Request[AnyContent] => Result = username => _ => User.find.....  

Am I right?
I get a "No by name parameter allowed here error".

If they don't use the second parameter why are they using String => Request => Result and not just simply String => Result?

Upvotes: 0

Views: 735

Answers (2)

Martin
Martin

Reputation: 1885

For me, the examples at https://github.com/mariussoutier/PlayBasics/tree/master/play-2.2-migration are very enlightening.

Upvotes: 0

dgrandes
dgrandes

Reputation: 1207

That function definition is actually a curried function definition.

String => Request => Result actually means: f(s:String):(r:Request)=>Result ie a function that takes a String and returns a function that takes a Request and returns a Result.

Check out the part "Spicing up your functions": http://danielwestheide.com/blog/2013/01/30/the-neophytes-guide-to-scala-part-11-currying-and-partially-applied-functions.html

Upvotes: 1

Related Questions