
Advanced.pudu
Pudu45 lines2.0 KB
1/** @Validation.Advanced.Control — composes custom and dependent rules */2module PuduLangValidator.Advanced34import PuduLangValidator.Result as Validation5import PuduLangValidator.Rule as Rule678export fn custom[T](name: Str, check: fn(T) -> Array[Validation.Failure]) -> Rule.Rule[T] {9 customWithContext(name, fn(root: T, _data: Rule.ContextData) -> Array[Validation.Failure] { check(root) })10}111213export fn customWithContext[T](14 name: Str, check: fn(T, Rule.ContextData) -> Array[Validation.Failure]15) -> Rule.Rule[T] {16 Rule.Rule{name: name, ruleSets: [], run: fn(root: T, _sets: Array[Str], _defaults: Bool, _properties: Array[Str], data: Rule.ContextData) -> Array[Validation.Failure] {17 check(root, data)18 } }19}202122export fn dependent[T](primary: Rule.Rule[T], next: Rule.Rule[T]) -> Rule.Rule[T] {23 let name = primary.name24 let sets = primary.ruleSets25 Rule.Rule{name: name, ruleSets: sets, run: fn(root: T, selected: Array[Str], includeDefault: Bool, properties: Array[Str], data: Rule.ContextData) -> Array[Validation.Failure] {26 let first = primary.run(root, selected, includeDefault, properties, data)27 if !first.isEmpty() { return first }28 next.run(root, selected, includeDefault, properties, data)29 } }30}313233export fn when[T](rule: Rule.Rule[T], condition: fn(T) -> Bool) -> Rule.Rule[T] {34 let name = rule.name35 let sets = rule.ruleSets36 Rule.Rule{name: name, ruleSets: sets, run: fn(root: T, selected: Array[Str], includeDefault: Bool, properties: Array[Str], data: Rule.ContextData) -> Array[Validation.Failure] {37 if condition(root) { rule.run(root, selected, includeDefault, properties, data) } else { [] }38 } }39}404142export fn unless[T](rule: Rule.Rule[T], condition: fn(T) -> Bool) -> Rule.Rule[T] {43 when(rule, fn(root: T) -> Bool { !condition(root) })44}45