in elitzur-core/src/main/scala/com/spotify/elitzur/validators/Validator.scala [287:318]
def split[T](sealedTrait: SealedTrait[Validator, T]): Validator[T] =
new Validator[T] {
def validateRecord(
a: PreValidation[T],
path: String = "",
outermostClassName: Option[String] = None,
config: ValidationRecordConfig = DefaultRecordConfig
): PostValidation[T] = {
sealedTrait.subtypes
.flatMap { x =>
// TODO: Same circular dereference/construction here
val y =
Try(
x.typeclass.validateRecord(
Unvalidated(x.cast(a.forceGet)),
path,
outermostClassName,
config
)
).toOption
y
}
.headOption
.getOrElse(
throw new Exception(
s"Couldn't find validator for any subtype of ${sealedTrait.typeName.full}"
)
)
}
override def shouldValidate: Boolean = true
}