Twitter Finagle is an amazing framework for RPC communication, and my interest is its HTTP features for creating RESTful APIs.

As I bloged at codemountain, I’m using finagle for a personal project. Don’t know how far it will go, but the facts is that I’m learning Finagle a lot.

During this project I needed to extract from the query string, a param to be parsed to a twitter.util.Time. I ended up with a Param Matcher to be used my a pattern match agains the requested path. The use of this Param Patcher is:

//...
Path(request.path) :? request.params match {
       case Root / "myPath" :? RequestTime(requestTimeParam)  => //do something
//..
}
//Where RequestTime is defined as
 object RequestTime extends DateParamMatcher("requestTimeParam")

The source of DateParamMatcher is the following.

import com.twitter.util.Time._
import com.twitter.util.Time
import java.text.ParseException
import com.twitter.finagle.http.path._
import com.twitter.finagle.http.ParamMap

/**
 * Extractor that takes a request parameter and converts it to a {twitter.util.Time}.
 * The date format should conform with {twitter.util.Time} default format.
 */
abstract class DateParamMatcher(name: String) {

  def unapply(params: ParamMap): Option[Time] = params.get(name) flatMap { value =>
    try {
      Some(at(value))
    } catch {
      case ex: ParseException =>
        None
    }
  }
}

Finagle also provides an abstract com.twitter.finagle.http.path.ParamMatcher as well as LongParamMatcher and IntParamMatcher in the same package. They are actually Scala Extractors (very well explained here by @codemonkeyism). This is a practical way to extract values from a query string and put it available at your code already parsed.

Note that if the param named requestTimeParam is not present or carries a invalid value for Time in the query string the None value is returned.

Although easy to build and extract params from query string and requested path, it is not a Finagle strength. It is kinda limited. A better abstraction is offered by Unfiltered(another @n8han’s great job).

Hope you enjoy it.