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」)讀取限制。 –