Skip to content

Instantly share code, notes, and snippets.

@joegaudet
Created April 13, 2012 19:07
Show Gist options
  • Save joegaudet/2379255 to your computer and use it in GitHub Desktop.
Save joegaudet/2379255 to your computer and use it in GitHub Desktop.
package com.matygo.validation
import com.matygo.validation.validators.Validator
import com.matygo.validation.validators.StringLengthValidatorFactory
class TestObject(val someString: String, var someString2: String) extends Validatable[TestObject] {
validates(
lengthOfString(_.someString, 1, 5),
lengthOfString(_.someString2, 1, 5))
}
object Test extends Application {
val test = new TestObject("Vest", "Vest")
println(test.validate(test))
test.someString2 = "Vest one two three"
println(test.validate(test))
}
/// ---
trait Validatable[A] extends StringLengthValidatorFactory[A]{
var validators: List[Validator[A, _]] = Nil
def addValidator(validator: Validator[A, _]) = validators :+ validator
def validate(a:A) = validators.forall(_.isValid(a))
def validates(toAdd: Validator[A, _]*) = validators = toAdd.toList ::: validators
}
package com.matygo.validation.validators
abstract class Validator[V, T] {
def accessor:((V => T))
def isValid(validatable:V):Boolean
}
package com.matygo.validation.validators
class StringLengthValidator[V](val accessor:(V => String), val min: Int, val max: Int) extends Validator[V, String] {
def isValid(validatable:V)= {
val string = accessor(validatable)
val length = string.length()
println("Validates: " + string);
length >= min && length <= max
}
}
trait StringLengthValidatorFactory[A] {
def lengthOfString(accessor:(A => String), min: Int, max: Int) = new StringLengthValidator[A](accessor, min, max)
def lengthOfStringIsAtLeast(accessor:(A => String), min: Int) = new StringLengthValidator[A](accessor, min, Integer.MAX_VALUE)
def lengthOfStringIsAtMost(accessor:(A => String), max: Int) = new StringLengthValidator[A](accessor, 0, max)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment