Scala 将验证约束与解组分离

Scala 将验证约束与解组分离,scala,shapeless,play-json,Scala,Shapeless,Play Json,我遇到了这个例子,它演示了新的play验证API与Shapess的结合。但我无法重新创建代码片段(可能是因为我不知道从何处导入) 如何正确创建Get实例?正如这篇文章所暗示的,这种方法与不成形镜片有什么关系?我是这篇博文的作者。这是我刚刚写的完整代码。您需要进行实验验证,以便将repo和sbt控制台克隆到项目中,或者将依赖项添加到项目中。我前一段时间写过这篇文章,所以它依赖于一个非常旧的Shapess版本 import play.api.data.mapping._ import shapele

我遇到了这个例子,它演示了新的play验证API与Shapess的结合。但我无法重新创建代码片段(可能是因为我不知道从何处导入)


如何正确创建
Get
实例?正如这篇文章所暗示的,这种方法与不成形镜片有什么关系?

我是这篇博文的作者。这是我刚刚写的完整代码。您需要进行实验验证,以便将repo和sbt控制台克隆到项目中,或者将依赖项添加到项目中。我前一段时间写过这篇文章,所以它依赖于一个非常旧的Shapess版本

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适用于任何数据结构。如果给定路径(_\'age),您可以在此位置获取/插入数据

Lens为您提供了一个方便的API来在case类上实现这一点。所以在幕后,(_\'age).read(min(0))将使用镜头访问Contact类中的field age(完全类型安全)


我现在时间不多,所以请不要犹豫提问,我会回答n一会儿:)

很高兴你找到了这条线索。我把它放在上面,因为在你的文章下面已经有类似的评论,没有任何反应<代码>验证试验似乎缺少一部分。我使用了
Get
,从这个不成形的拉链包中获取信息,这让我非常困惑。事实上,迈尔斯·萨宾发现了这条线索,并给我发了一条消息:)很抱歉没有回复评论部分。我通常回答得很快,但不知何故,我完全错过了这一个…让代码正常工作,不幸的是,只有shapeless 2.0.0和
模式匹配在细化类型上未选中
警告,但我想这是一个开始(:
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)