按错误代码分组的 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))))