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)
}
}