1 module dutils.validation.constraints; 2 3 import std.conv : to; 4 import std.typecons : Nullable; 5 6 import dutils.validation.validate : ValidationError; 7 8 struct ValidateRequired { 9 Nullable!ValidationError getError(T)(T value, string path) { 10 if (value) { 11 return Nullable!ValidationError.init; 12 } 13 14 return Nullable!ValidationError(ValidationError(path, 15 ValidationErrorTypes.required, "Required to have a value")); 16 } 17 } 18 19 struct ValidateEmail { 20 Nullable!ValidationError getError(string value, string path) { 21 import dutils.validation.email : isValidEmail; 22 23 if (isValidEmail(value)) { 24 return Nullable!ValidationError.init; 25 } 26 27 return Nullable!ValidationError(ValidationError(path, 28 ValidationErrorTypes.email, "Value must be an email string")); 29 } 30 } 31 32 struct ValidateMinimum(T) { 33 T minimum; 34 35 Nullable!ValidationError getError(T value, string path) { 36 if (value.to!T >= this.minimum) { 37 return Nullable!ValidationError.init; 38 } 39 40 return Nullable!ValidationError(ValidationError(path, ValidationErrorTypes.minimum, 41 "Value cannot be less than " ~ this.minimum.to!string, 42 ["minimum": this.minimum.to!double])); 43 } 44 } 45 46 struct ValidateMaximum(T) { 47 T maximum; 48 49 Nullable!ValidationError getError(T value, string path) { 50 if (value.to!T <= this.maximum) { 51 return Nullable!ValidationError.init; 52 } 53 54 return Nullable!ValidationError(ValidationError(path, ValidationErrorTypes.maximum, 55 "Value cannot be greater isBuiltinTypethan " ~ this.maximum.to!string, 56 ["maximum": this.maximum.to!double])); 57 } 58 } 59 60 struct ValidateMinimumLength { 61 uint minimumLength; 62 63 Nullable!ValidationError getError(string value, string path) { 64 if (value.length >= this.minimumLength) { 65 return Nullable!ValidationError.init; 66 } 67 68 return Nullable!ValidationError(ValidationError(path, ValidationErrorTypes.minimumLength, 69 "Value cannot be shorter than " ~ this.minimumLength.to!string, 70 ["minimumLength": this.minimumLength.to!double])); 71 } 72 } 73 74 struct ValidateMaximumLength { 75 uint maximumLength; 76 77 Nullable!ValidationError getError(string value, string path) { 78 if (value.length <= this.maximumLength) { 79 return Nullable!ValidationError.init; 80 } 81 82 return Nullable!ValidationError(ValidationError(path, ValidationErrorTypes.maximumLength, 83 "Value cannot be longer than " ~ this.maximumLength.to!string, 84 ["maximumLength": this.maximumLength.to!double])); 85 } 86 } 87 88 enum ValidationErrorTypes { 89 type = "type", 90 required = "required", 91 email = "email", 92 minimum = "minimum", 93 maximum = "maximum", 94 minimumLength = "minimumLength", 95 maximumLength = "maximumLength" 96 }