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