Skip to content

Instantly share code, notes, and snippets.

@dgouyette
Last active April 7, 2017 09:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dgouyette/6d09a5ce4a986455a93b63add5798f01 to your computer and use it in GitHub Desktop.
Save dgouyette/6d09a5ce4a986455a93b63add5798f01 to your computer and use it in GitHub Desktop.
import jto.validation.{Rule, VA}
import shapeless.Witness
import shapeless.labelled.{FieldType, field}
import shapeless._
import scala.language.implicitConversions
trait Validator {
def rules: Rule[String, String]
def validate(value: String): VA[String] = rules.validate(value)
}
object EmailValidator extends Validator {
val rules: Rule[String, String] = Rules.email |+| Rules.notEmpty
}
object FirstnameValidator extends Validator {
override def rules: Rule[String, String] = Rules.minLength(3)
}
def validField(in: FieldType[T, String])(implicit witness: Witness.Aux[T]) = {
getFieldName(in) match {
case v: Validator => v.validate(in)
}
}
implicit def email(value: String) = field[EmailValidator.type](value)
implicit def firstname(value: String) = field[FirstnameValidator.type](value)
//implicit def cgu(value : String) = field[BooleanValidator.type](value)
//implicit def boolean(value : String) = field[BooleanValidator.type ](value)
def getFieldName[K, V](value: FieldType[K, V])(implicit witness: Witness.Aux[K]): K = witness.value
def getFieldValue[K, V](value: FieldType[K, V]): V = value
object validate extends Poly1 {
implicit def genericString[K <: Validator](implicit witness: Witness.Aux[K]) = at((x: FieldType[K, String]) => {
getFieldName(x).validate(getFieldValue(x))
})
}
validate(email("damien.gouyette@gmail.com"))
validate(email("invalid"))
validate(firstname("Da"))
validate(firstname("Damien"))
//validate(cgu("true"))
//validate(boolean("true"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment