Skip to content

Commit

Permalink
Yet another field
Browse files Browse the repository at this point in the history
  • Loading branch information
nob13 committed Mar 31, 2023
1 parent affd157 commit ac761f8
Showing 1 changed file with 26 additions and 2 deletions.
@@ -1,10 +1,34 @@
package net.reactivecore.cjs.validator.impl

import net.reactivecore.cjs.validator.{ValidationProvider, Validator}
import scala.deriving.Mirror
import scala.compiletime.{erasedValue, summonInline}
import net.reactivecore.cjs.SchemaOrigin

/** Helper trait for synthetic validation provider for case classes */
trait CombinedValidationProvider[T] extends ValidationProvider[T]

object CombinedValidationProvider {
implicit def provide[T]: CombinedValidationProvider[T] = ???
}
implicit inline def provide[T <: Product](using m: Mirror.ProductOf[T]): CombinedValidationProvider[T] = {
val tupleVariant = provideForTuple[m.MirroredElemTypes]
new CombinedValidationProvider[T] {
override def apply(origin: SchemaOrigin, restriction: T): Validator = {
val validators = restriction.productIterator.zip(tupleVariant).map { case (field, subValidationProvider) =>
subValidationProvider(origin, field)
}
Validator.sequence(validators.toSeq: _*)
}
}
}

private inline def provideForTuple[T <: Tuple]: List[ValidationProvider[Any]] = {
inline erasedValue[T] match {
case _: EmptyTuple => Nil
case _: (t *: ts) =>
val first = summonInline[ValidationProvider[t]].asInstanceOf[ValidationProvider[Any]]
val last = provideForTuple[ts]
first :: last
}
}

}

0 comments on commit ac761f8

Please sign in to comment.