private[validation] def parseMethodValidationFailures[T]()

in util-validator/src/main/scala/com/twitter/util/validation/ScalaValidator.scala [1451:1506]


  private[validation] def parseMethodValidationFailures[T](
    rootClazz: Option[Class[T]],
    root: Option[T],
    leaf: Option[Any],
    path: PathImpl,
    annotation: MethodValidation,
    method: Method,
    result: MethodValidationResult,
    value: Any,
    constraintDescriptor: ConstraintDescriptor[_]
  ): Set[ConstraintViolation[T]] = {
    def methodValidationConstraintViolation(
      validationPath: PathImpl,
      message: String,
      payload: Payload
    ): ConstraintViolation[T] = {
      constraintViolationFactory.newConstraintViolation[T](
        messageTemplate = annotation.message(),
        interpolatedMessage = message,
        path = validationPath,
        invalidValue = value.asInstanceOf[T],
        rootClazz = rootClazz.orNull,
        root = root.getOrElse(null.asInstanceOf[T]),
        leaf = leaf.orNull,
        constraintDescriptor = constraintDescriptor,
        payload = payload
      )
    }

    result match {
      case invalid: MethodValidationResult.Invalid =>
        val results = mutable.HashSet[ConstraintViolation[T]]()
        val annotationFields: Array[String] = annotation.fields.filter(_.nonEmpty)
        if (annotationFields.nonEmpty) {
          var index = 0
          val length = annotationFields.length
          while (index < length) {
            val fieldName = annotationFields(index)
            val parameterPath = PathImpl.createCopy(path)
            parameterPath.addParameterNode(fieldName, index)
            results.add(
              methodValidationConstraintViolation(
                parameterPath,
                invalid.message,
                invalid.payload.orNull)
            )
            index += 1
          }
          if (results.nonEmpty) results.toSet
          else Set.empty[ConstraintViolation[T]]
        } else {
          Set(methodValidationConstraintViolation(path, invalid.message, invalid.payload.orNull))
        }
      case _ => Set.empty[ConstraintViolation[T]]
    }
  }