Skip to content

Instantly share code, notes, and snippets.

@mingyang91
Created March 19, 2018 13:02
Show Gist options
  • Save mingyang91/e4cec842b7625495165fabc20041e05a to your computer and use it in GitHub Desktop.
Save mingyang91/e4cec842b7625495165fabc20041e05a to your computer and use it in GitHub Desktop.
尝试移除模板代码
// utils
class FromJsonQueryStringBindable[T] ()(implicit decoder: Decoder[T],
encoder: Encoder[T]) extends QueryStringBindable[T] {
implicit val binder: QueryStringBindable[Json] = JsonQueryStringBindable
override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, T]] =
binder.bind(key, params).map(_.flatMap(_.as[T].left.map(_.message)))
override def unbind(key: String, value: T): String = s"$key=${value.asJson}"
}
object JsonQueryStringBindable extends QueryStringBindable[Json] {
override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, Json]] =
params.get(key).flatMap(_.headOption).map(parse(_).left.map(_.message))
override def unbind(key: String, value: Json): String = s"$key=${value.toString}"
}
// models
case class CandidateFilter()
object CandidateFilter {
implicit def queryStringBindable = new FromJsonQueryStringBindable[CandidateFilter]
}
case class Order[T]()
object Order {
implicit def queryStringBindable[T] = new FromJsonQueryStringBindable[Order[T]]
}
case class Paging (size: Int = 10, number: Int = 1)
object Paging {
implicit def queryStringBindable = new FromJsonQueryStringBindable[Paging]
}
//routes
GET /api/open-candidates/ controllers.CandidateController.list(filter: models.CandidateFilter ?= new models.CandidateFilter, order: models.Order[com.mesoor.models.TenantTables.CandidateRow] ?= new models.Order[com.mesoor.models.TenantTables.CandidateRow], paging: models.Paging ?= new models.Paging()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment