Skip to content

Instantly share code, notes, and snippets.

@id-ilych
Last active February 16, 2016 18:17
Show Gist options
  • Save id-ilych/ed4576199f0559a3009b to your computer and use it in GitHub Desktop.
Save id-ilych/ed4576199f0559a3009b to your computer and use it in GitHub Desktop.
Helper methods for getting/applying request params
trait Request {
def getParam(key: String): String
def getCommaParamList(key: String): Seq[String]
def paramOpt[T](key: String)(implicit reader: ParamReader[T]): Option[T] = Option(getParam(key)).map(reader.read)
def paramOpt[T](key: String, op: T => _)(implicit reader: ParamReader[T]): Unit = paramOpt(key).foreach(op)
def param[T](key: String)(implicit reader: ParamReader[T]): T = reader.read(getParam(key))
def param[T](key: String, op: T => _)(implicit reader: ParamReader[T]): Unit = op(param(key))
def paramExists(key: String): Boolean = getParam(key) != null
def paramExists(key: String, op: Boolean => _): Unit = op(paramExists(key))
def paramZipAll[A, B](keyA: String, keyB: String)(implicit readerA: ParamReader[A], readerB: ParamReader[B]): Iterable[(A, B)] = {
val as = getCommaParamList(keyA)
val bs = getCommaParamList(keyB)
require(as.length == bs.length)
as.view.zip(bs.view).map {
case (a, b) =>
(readerA.read(a), readerB.read(b))
}
}
def paramZipAll[A, B](keyA: String, keyB: String, op: (A, B) => _)(implicit readerA: ParamReader[A], readerB: ParamReader[B]): Unit = {
paramZipAll[A, B](keyA, keyB).foreach {
case (a, b) => op(a, b)
}
}
}
trait ParamReader[T] {
def read(value: String): T
}
object ParamReader {
implicit val stringReader = new ParamReader[String] {
def read(value: String) = value
}
implicit val intReader = new ParamReader[Int] {
def read(value: String) = value.toInt
}
implicit val longReader = new ParamReader[Long] {
def read(value: String) = value.toLong
}
implicit val doubleReader = new ParamReader[Double] {
def read(value: String) = value.toDouble
}
implicit val boolReader = new ParamReader[Boolean] {
def read(value: String) = value == "true" || value == "1"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment