private def getValidationTypeFromCaseClass()

in elitzur-scio/src/main/scala/com/spotify/elitzur/scio/ElitzurMetrics.scala [97:124]


  private def getValidationTypeFromCaseClass(caseClassClass: Class[_],
                                             fieldNames: Seq[String]): Class[_] = {

    val firstFieldName = fieldNames(0)
    val firstFieldClass: Class[_] = caseClassClass.getDeclaredField(firstFieldName).getType
    val firstFieldGenericType: Type = caseClassClass.getDeclaredField(firstFieldName).getGenericType

    val isOption = classOf[Option[_]].equals(firstFieldClass)
    val isWrapped = classOf[ValidationStatus[_]].isAssignableFrom(firstFieldClass)
    val isSeq = classOf[Seq[_]].isAssignableFrom(firstFieldClass)

    fieldNames match {
      case Seq(_) if isWrapped =>
        unwrapValidationStatus(firstFieldGenericType)
      case Seq(_) if isOption || isSeq =>
        // remove one layer of parameterization only
        getParameterizedInnerType(firstFieldGenericType).asInstanceOf[Class[_]]
      case Seq(_) =>
        // no parameterization
        firstFieldClass
      case Seq(_, tail@_*) if isOption || isSeq =>
        getValidationTypeFromCaseClass(unwrapOptionType(firstFieldGenericType), tail)
      case Seq(_, tail@_*) if isWrapped =>
        getValidationTypeFromCaseClass(unwrapValidationStatus(firstFieldGenericType), tail)
      case Seq(_, tail@_*) =>
        getValidationTypeFromCaseClass(firstFieldClass, tail)
    }
  }