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 }