form-binder v0.3.0 发布,微型数据绑定和校验框架
Git@OSC 手机客户端摇一摇,有惊喜有妹纸
这是 form-binder 的第一版,不过已经相当完善,一般情况应该够用了。
测试覆盖率相当高,加上代码并不复杂,质量应该是有保障的。
有问题或建议请发 issue,我一般都会及时处理的。
=================================
form-binder 是一个容易使用和定制的微型数据绑定和校验框架。
它有如下特点:
非常轻量,总共才 700 来行代码(框架 + 内置扩展)
容易使用,使用过程没有冗余代码,所见及所得
高度可定制,你可以扩展几乎每一个执行点
容易扩展,每个扩展接口都只是一个 FunctionN 的别名
不可变性,让你可以安全的共享/(嵌套)复用 mapping定义对象
form-binder 一开始是为我一个基于 Scalatra 的项目准备的,用起来会比 Scalatra 内置的 Command 框架方便不少。但是你可以把它用在其他地方,因为它不依赖 Scalatra 的代码(甚至都没有对 Scalatra 的集成做内置支持),非常容易和其他框架集成。
它单纯使用的示例代码是这样的:
import com.github.tminglei.bind.simple._case class Order(name: String, email: String, price: Float, count: Int)val binder = expandJsonData("json") pipe_: FormBinder(messages).withErr(errsToJson4s)val mappings = tmapping( "id" -> long(), "json" -> mapping( "name" -> text(maxlength(100)), "email" -> text(email()), "price" -> (cleanPrefix("$") pipe_: float()), "count" -> number().verifying(min(3)) )(Order.apply).label("order")).verifying { case ((id, order), messages) => //do some extra verifying Nil }///val data = Map( "id" -> "133", "json" -> """{"name":"xxxx", "email":"123@example.com", "price":"$137.5", "count":5}""")binder.bind(mappings, data) { case (id, order) => //do something ...}
和 Scalatra 的集成,我是这样做的:
// firstly, create your FormBindSupport.scalaimport com.github.tminglei.bind.simple._object MyFormBindSupport { val BindMessagesKey = "bind-messages"}trait MyFormBindSupport extends I18nSupport { this: ScalatraBase => import MyFormBindSupport._ before() { request(BindMessagesKey) = Messages(locale, bundlePath = "i18n/bind-messages") } def binder(implicit request: HttpServletRequest) = expandJsonData("json") pipe_: FormBinder(bindMessages.apply).withErr(errsToJson4s) /// private def bindMessages(implicit request: HttpServletRequest): Messages = if (request == null) { throw new ScalatraException("There needs to be a request in scope to call bindMessages") } else { request.get(BindMessagesKey).map(_.asInstanceOf[Messages]).orNull }}// then use it in your xxxxxxxxServlet.scalaimport com.github.tminglei.bind.simple._class FeatureServlet extends ScalatraServlet with MyFormBindSupport { get("/:id") { val mappings = tmapping( "id" -> long() ) binder.bind(mappings, params) { case (id) => repos.features.get(id) } }}
更多细节请浏览项目主页。