Skip to content

Instantly share code, notes, and snippets.

@rossabaker
Forked from joegaudet/gist:2379255
Created April 13, 2012 19:36
Show Gist options
  • Save rossabaker/2379523 to your computer and use it in GitHub Desktop.
Save rossabaker/2379523 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.someString2 = "Vest one two three"
println(test.validate())
}
/// ---
trait Validatable[A] extends StringLengthValidatorFactory[A]{
var validators: List[Validator[this.type, _]] = Nil
def addValidator(validator: Validator[this.type, _]) = validators :+ validator
def validate() = validators.forall(_.isValid(this))
def validates(toAdd: Validator[this.type, _]*) = 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