将验证约束与解组

时间:2015-07-15 16:10:13

标签: scala shapeless play-json

我遇到了这个article,它演示了与无形无关的新游戏验证API。我虽然无法重新创建代码片段(可能是因为我不知道从哪里导入)。

import play.api.libs.json._
import play.api.data.mapping._
import play.api.data.mapping.json._
import shapeless.ops.zipper._

case class User( email: String, password: String )

val reads = Rule.gen[JsValue, User]

// This line is based on code of the article but I'm not sure how to implement it
val validation = Get{ __ =>
  ( __ \ 'email ).read( email )
}

( reads compose validation ).validate( ... )

如何正确创建Get实例?如文章暗示的那样,这种方法与无形镜片有什么关系呢?

1 个答案:

答案 0 :(得分:4)

我是博文的作者。这是我刚写的完整代码。您需要验证实验,因此您可以将repo和sbt控制台克隆到项目中,或者将依赖项添加到项目中。我刚刚写了这篇文章,所以这取决于一个非常老的无形状版本。

import play.api.data.mapping._
import shapeless._

case class ContactInformation(
  label: String,
  email: String,
  phones: Seq[String])

case class Contact(
  firstname: String,
  lastname: String,
  age: Int,
  informations: Seq[ContactInformation])

object Rules extends GenericRules
import Rules._

val contactInfoG = Get[ContactInformation]{ __ =>
  (__ \ 'label).read(notEmpty) ~>
  (__ \ 'email).read(email)
}

val contactG = Get[Contact]{ __ =>
  (__ \ 'age).read(min(0)) ~>
  (__ \ 'informations).read(seqR(contactInfoG))
}

val contact = Contact("Julien", "Tournay", -1, Seq(ContactInformation("Personal", "not quite what I expected", List("01.23.45.67.89", "98.76.54.32.10"))))
contactG.validate(contact)

与镜头的关系如下。验证意味着使用像json或xml这样的树形数据结构。它以道路概念为中心。基本上,API适用于任何数据结构,如果它可以通过路径浏览。这是路径(__ \'年龄),您可以在此位置获取/插入数据。

Lens为您提供了一个方便的API来处理案例类。所以在幕后,(__ \'age).read(min(0))将使用镜头访问Contact类中的字段时代(并且它完全是类型安全的)。

我没有太多时间知道,所以不要犹豫提问,我会回答一下:)