JsConstraints#filter
具有以下特征
def filter[A](otherwise: ValidationError)(p: A => Boolean)(implicit reads: Reads[A])
,当你写
filter(ValidationError("error.scope.value"))(??? == JsString("user") || ??? == JsString("group")))
代码(??? == JsString("user") || ??? == JsString("group"))
其实是过滤第二个参数,因此应当是A => Boolean
谓语。此外,由于这是在email
读数为Reads[String]
之后应用的,所以您的实际A
是String
,因此您应该丢弃JsString
。
你可以写最小的变化是:
implicit val aclRuleScopeRead = (
(__ \ "type").read[String](pattern("^(default|user|group|domain)$".r)) and
(__ \ "value").read[String](
email keepAnd
filter(
ValidationError("error.scope.value")
)(x => x == "user" || x == "group"))
).tupled
我强烈建议您谓词提取到它自己的方法:
def isValidEmail: (String) => Boolean = {
x => x == "user" || x == "group"
}
,写你的行文
implicit val aclRuleScopeRead = (
(__ \ "type").read[String](pattern("^(default|user|group|domain)$".r)) and
(__ \ "value").read[String](
email keepAnd filter(ValidationError("error.scope.value"))(isValidEmail))
).tupled
更好,你可以有
val validEmail = email keepAnd filter(ValidationError("error.scope.value"))(isValidEmail))
,写
implicit val aclRuleScopeRead = (
(__ \ "type").read[String](pattern("^(default|user|group|domain)$".r)) and
(__ \ "value").read[String](validEmail)
).tupled
在澄清的意见,你只希望如果类型是“用户”或“集团”返回一个空字符串,如果不是这样解析电子邮件。
答案是接近this question
概述的溶液中value
场的读取首先需要检查type
字段的值。类型字段上的条件如下所示:
(__ \“type”)。read [String] .filter(ValidationError(“error.scope。值“))(isEmailType)
其中isEmailType被定义为
def isEmailType: (String) => Boolean = { x => x == "user" || x == "group" }
这将返回一个读,给出了一个JsSuccess
如果类型是user
或group
和JsError
否则,从评论,我们知道,我们应该返回空字符串,如果该类型不是user
或group
,在读可以成为:
(__ \ "type").read[String]
.filter(ValidationError("error.scope.value"))(isEmailType)
.orElse Reads.pure("")
是一种安全,绝不会返回一个JsError
。这很好,因为有专门的reads
来强制type
验证,我们目前操作的读取仅作为验证的一部分value
。 现在,我们需要改变读取解析value
如果解析是JsSuccess
:
(__ \ "type").read[String]
.filter(ValidationError("error.scope.value"))(isEmailType)
.flatMap(_ => (__ \ "value").read[String](email))
.orElse Reads.pure("")
使用flatMap,我们更换type
读取由上value
正确读取如果type
读取是成功的。
validEmail将测试(__ \ “值”)?因为“用户”||,验证将是错误的“组”不是有效的电子邮件。如果(__ \“type”)等于“user”||,我想测试(__ \“value”)是仅限电子邮件“组”。我需要'???'作为(__ \“type”)的值 –
噢好吧抱歉,我想我明白你的意思是它将会变长:)如果类型是别的东西,只要一个字符串? – Jean
for'default'type - 空字符串,'domain'类型 - (__ \“value”)值。其他类型受(__ \“type”)读取限制。 –