按错误代码分组的 Scala Cat 库验证列表
Scala Cat library validation list group by Error code
我是 Scala 的新手,功能 programming.I 使用 Scala cat 库进行了一次验证。但是我无法通过错误代码对无效元素进行分组。
case class Err(code: ErrorCode, elementName: String)
这是无效元素的输出。
List(Invalid(NonEmptyList(Err(missingElement,Des), Err(InvalidElement,order), Err(InvalidElement,name), Err(InvalidElement,source))))
我想要的是这样的
missingElement->List(Des)
InvalidElement->List(order,name,source)
cat 库本身有这方面的功能吗?或者有什么解决方法吗?
假设您的完整结构与此类似:
sealed trait ErrorCode
object ErrorCode {
case object MissingElement extends ErrorCode
case object InvalidElement extends ErrorCode
}
final case class Err(code: ErrorCode, elementName: String)
我们有一个 ValidatedNel[Err, ?]
:
val res: ValidatedNel[Err, String] =
Invalid(
NonEmptyList(
Err(ErrorCode.MissingElement, "Des"),
List(
Err(ErrorCode.InvalidElement, "order"),
Err(ErrorCode.InvalidElement, "name"),
Err(ErrorCode.InvalidElement, "source")
)
)
)
然后,为了对列表进行分组,您需要做的是在错误端使用 groupBy
,使用 leftMap
:
val groupedErrs: Validated[Map[ErrorCode, List[String]], String] =
res.leftMap(
_.toList
.groupBy(_.code)
.map { case (code, errs) => code -> errs.map(_.elementName) }
)
结果:
Invalid(Map(InvalidElement -> List(order, name, source), MissingElement -> List(Des)))
如果所有这些都在验证列表中,List[ValidatedNel[Err, ?]]
,那么我们只需要一个额外的 map
操作来迭代列表:
val groupedErrs: List[Validated[Map[ErrorCode, List[String]], String]] =
res.map(
_.leftMap(
_.toList
.groupBy(_.code)
.map { case (code, errs) => code -> errs.map(_.elementName) }
)
)
结果:
List(Invalid(Map(InvalidElement -> List(order, name, source), MissingElement -> List(Des))))
我是 Scala 的新手,功能 programming.I 使用 Scala cat 库进行了一次验证。但是我无法通过错误代码对无效元素进行分组。
case class Err(code: ErrorCode, elementName: String)
这是无效元素的输出。
List(Invalid(NonEmptyList(Err(missingElement,Des), Err(InvalidElement,order), Err(InvalidElement,name), Err(InvalidElement,source))))
我想要的是这样的
missingElement->List(Des)
InvalidElement->List(order,name,source)
cat 库本身有这方面的功能吗?或者有什么解决方法吗?
假设您的完整结构与此类似:
sealed trait ErrorCode
object ErrorCode {
case object MissingElement extends ErrorCode
case object InvalidElement extends ErrorCode
}
final case class Err(code: ErrorCode, elementName: String)
我们有一个 ValidatedNel[Err, ?]
:
val res: ValidatedNel[Err, String] =
Invalid(
NonEmptyList(
Err(ErrorCode.MissingElement, "Des"),
List(
Err(ErrorCode.InvalidElement, "order"),
Err(ErrorCode.InvalidElement, "name"),
Err(ErrorCode.InvalidElement, "source")
)
)
)
然后,为了对列表进行分组,您需要做的是在错误端使用 groupBy
,使用 leftMap
:
val groupedErrs: Validated[Map[ErrorCode, List[String]], String] =
res.leftMap(
_.toList
.groupBy(_.code)
.map { case (code, errs) => code -> errs.map(_.elementName) }
)
结果:
Invalid(Map(InvalidElement -> List(order, name, source), MissingElement -> List(Des)))
如果所有这些都在验证列表中,List[ValidatedNel[Err, ?]]
,那么我们只需要一个额外的 map
操作来迭代列表:
val groupedErrs: List[Validated[Map[ErrorCode, List[String]], String]] =
res.map(
_.leftMap(
_.toList
.groupBy(_.code)
.map { case (code, errs) => code -> errs.map(_.elementName) }
)
)
结果:
List(Invalid(Map(InvalidElement -> List(order, name, source), MissingElement -> List(Des))))