
Number.pudu
Pudu73 lines3.9 KB
1/** @Validation.Rules.Number.Module — checks integer property bounds */2module PuduLangValidator.Rules.Number34import PuduLangValidator.Rule as Rule567export fn greaterThan[T](builder: Rule.RuleBuilder[T, Int], bound: Int) -> Rule.RuleBuilder[T, Int] {8 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value > bound),9 "Number must be greater than \{ComparisonValue\}."), "GreaterThan"), "ComparisonValue", show(bound))10}111213export fn greaterThanOrEqualTo[T](builder: Rule.RuleBuilder[T, Int], bound: Int) -> Rule.RuleBuilder[T, Int] {14 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value >= bound),15 "Number must be at least \{ComparisonValue\}."), "GreaterThanOrEqualTo"), "ComparisonValue", show(bound))16}171819export fn lessThan[T](builder: Rule.RuleBuilder[T, Int], bound: Int) -> Rule.RuleBuilder[T, Int] {20 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value < bound),21 "Number must be less than \{ComparisonValue\}."), "LessThan"), "ComparisonValue", show(bound))22}232425export fn lessThanOrEqualTo[T](builder: Rule.RuleBuilder[T, Int], bound: Int) -> Rule.RuleBuilder[T, Int] {26 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value <= bound),27 "Number must be at most \{ComparisonValue\}."), "LessThanOrEqualTo"), "ComparisonValue", show(bound))28}293031export fn inclusiveBetween[T](builder: Rule.RuleBuilder[T, Int], low: Int, high: Int) -> Rule.RuleBuilder[T, Int] {32 let checked = Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value >= low && value <= high),33 "Number must be from \{From\} through \{To\}."), "InclusiveBetween")34 Rule.withArgument(Rule.withArgument(checked, "From", show(low)), "To", show(high))35}363738export fn exclusiveBetween[T](builder: Rule.RuleBuilder[T, Int], low: Int, high: Int) -> Rule.RuleBuilder[T, Int] {39 let checked = Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value > low && value < high),40 "Number must be between \{From\} and \{To\}, excluding both."), "ExclusiveBetween")41 Rule.withArgument(Rule.withArgument(checked, "From", show(low)), "To", show(high))42}434445export fn equal[T](builder: Rule.RuleBuilder[T, Int], expected: Int) -> Rule.RuleBuilder[T, Int] {46 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value == expected),47 "Number must equal \{ComparisonValue\}."), "Equal"), "ComparisonValue", show(expected))48}495051export fn notEqual[T](builder: Rule.RuleBuilder[T, Int], excluded: Int) -> Rule.RuleBuilder[T, Int] {52 Rule.withArgument(Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value != excluded),53 "Number must differ from \{ComparisonValue\}."), "NotEqual"), "ComparisonValue", show(excluded))54}555657export fn notEmpty[T](builder: Rule.RuleBuilder[T, Int]) -> Rule.RuleBuilder[T, Int] {58 Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value != 0),59 "Number must be nonzero."), "NotEmpty")60}616263export fn empty[T](builder: Rule.RuleBuilder[T, Int]) -> Rule.RuleBuilder[T, Int] {64 Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| value == 0),65 "Number must be zero."), "Empty")66}676869export fn isInEnum[T](builder: Rule.RuleBuilder[T, Int], valid: Array[Int]) -> Rule.RuleBuilder[T, Int] {70 Rule.withCode(Rule.withMessage(Rule.must(builder, |value: Int| valid.contains(value)),71 "Number is outside the named cases."), "IsInEnum")72}73