如果验证通过,Cats Validated返回输入,而不进行过映射

时间:2018-02-23 17:14:36

标签: scala scala-cats

我做表格validation。想象一下,我们想要验证Cat案例类字段的某些子集:

case class Cat(name: String, age: Int, weight: Double)

def validateCatName(name: String): ValidationResult[String]
def validateCatAge(age: Int): ValidationResult[Int]

def validateCatForm(cat: Cat): ValidationResult[Cat] = {
    (validateCatName(cat.name),
    validateCatAge(cat.age)
    ).mapN((_, _) => cat)
  }

我无法理解mapN((r1, ..., rN) => Result(r1, ..., rN))。 例如,在我的情况下,我必须mapN((validatedName, validatedAge) => Cat(validatedName, validatedAge, cat.weight)。 实际上我想忽略经过验证的结果,并且使用哑的params重新映射。像这样:

def validateCatForm(cat: Cat): ValidationResult[Cat] = {
        (validateCatName(cat.name),
        validateCatAge(cat.age)
        ).ifValid(cat)
      }

有可能吗?

1 个答案:

答案 0 :(得分:2)

您可以忽略参数并直接返回cat

def validateCatForm(cat: Cat): ValidationResult[Cat] = {
  (
    validateCatName(cat.name),
    validateCatAge(cat.age)
  ).mapN{ (_, _) => cat }
}

但是,请记住,通常构造函数的工作是确保每个构造的Cat实际上是有效的。 validateCatForm应该直接接受nameage,然后你可以写:

def validateCatForm(name: String, age: Int): ValidationResult[Cat] = {
  (
    validateCatName(name),
    validateCatAge(age)
  ).mapN{ new Cat(_, _) }
}

通过这种方式,您不会强制API的用户创建任何无效的Cat,只是为了将它们传递给表单验证方法。