【发布时间】:2019-01-24 15:45:14
【问题描述】:
以下是我的用例
- 我正在使用Cats 来验证我的配置。我的配置文件在 json 中。
- 我使用lift-json 将我的配置文件反序列化为我的案例类
Config,然后使用Cats 对其进行验证。我使用this 作为指导。 - 我使用 Cats 的目的是收集验证时存在的所有错误。
我的问题是指南中给出的示例,属于类型
case class Person(name: String, age: Int)
def validatePerson(name: String, age: Int): ValidationResult[Person] = {
(validateName(name),validate(age)).mapN(Person)
}
但在我的情况下,我已经将我的配置反序列化到我的案例类中(下面是一个示例),然后我将其传递给验证
case class Config(source: List[String], dest: List[String], extra: List[String])
def vaildateConfig(config: Config): ValidationResult[Config] = {
(validateSource(config.source), validateDestination(config.dest))
.mapN { case _ => config }
}
这里的区别是mapN { case _ => config }。因为如果一切都有效,我已经有了一个配置,我不想从它的成员中重新创建配置。当我传递配置来验证函数而不是它的成员时,就会出现这种情况。
我工作场所的一个人告诉我这不是正确的方法,因为 Cats Validated 提供了一种在其成员有效的情况下构造对象的方法。如果其成员无效,则该对象不应存在或不可构造。这对我来说完全有意义。
那么我应该做些改变吗?以上我做的可以接受吗?
PS:上面的配置只是一个例子,我的真实配置可以有其他案例类作为其成员,它们本身可以依赖于其他案例类。
【问题讨论】:
-
您对这些列表进行了哪些验证?如果您想要额外的类型级别强制执行,请查看refined
-
@YuvalItzchakov 肯定会调查的。但我描述的方式是否违反了良好做法?
-
绝对不是。这是验证无法使用类型级别 shananigans 强制执行的解析输入的一种完全有效的方法
-
感谢 Yuval Itzchakov 提供宝贵的 cmets。
标签: scala validation functor scala-cats