wasm_dbms_api/dbms/validate/
strlen.rs1use crate::prelude::{DbmsError, Validate, Value};
2
3pub struct MaxStrlenValidator(pub usize);
16
17impl Validate for MaxStrlenValidator {
18 fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
19 let Value::Text(text) = value else {
20 return Err(DbmsError::Validation("Value is not a `Text`".to_string()));
21 };
22
23 let s = &text.0;
24
25 if s.len() <= self.0 {
26 Ok(())
27 } else {
28 Err(DbmsError::Validation(format!(
29 "String length {} exceeds maximum allowed length of {}",
30 s.len(),
31 self.0
32 )))
33 }
34 }
35}
36
37pub struct MinStrlenValidator(pub usize);
49
50impl Validate for MinStrlenValidator {
51 fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
52 let Value::Text(text) = value else {
53 return Err(DbmsError::Validation("Value is not a `Text`".to_string()));
54 };
55
56 let s = &text.0;
57
58 if s.len() >= self.0 {
59 Ok(())
60 } else {
61 Err(DbmsError::Validation(format!(
62 "String length {} is less than minimum required length of {}",
63 s.len(),
64 self.0
65 )))
66 }
67 }
68}
69
70pub struct RangeStrlenValidator(pub usize, pub usize);
85
86impl Validate for RangeStrlenValidator {
87 fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
88 let Value::Text(text) = value else {
89 return Err(DbmsError::Validation("Value is not a `Text`".to_string()));
90 };
91
92 let s = &text.0;
93 let len = s.len();
94
95 if len >= self.0 && len <= self.1 {
96 Ok(())
97 } else {
98 Err(DbmsError::Validation(format!(
99 "String length {} is not within the allowed range of {} to {}",
100 len, self.0, self.1
101 )))
102 }
103 }
104}
105
106#[cfg(test)]
107mod tests {
108
109 use super::*;
110 use crate::prelude::Text;
111
112 #[test]
113 fn test_max_strlen_validator() {
114 let validator = MaxStrlenValidator(5);
115
116 let valid_value = Value::Text(Text("Hello".to_string()));
117 let invalid_value = Value::Text(Text("Hello, World!".to_string()));
118
119 assert!(validator.validate(&valid_value).is_ok());
120 assert!(validator.validate(&invalid_value).is_err());
121 }
122
123 #[test]
124 fn test_max_strlen_validator_non_text() {
125 let validator = MaxStrlenValidator(5);
126 let non_text_value = Value::Uint32(crate::prelude::Uint32(42));
127 assert!(validator.validate(&non_text_value).is_err());
128 }
129
130 #[test]
131 fn test_min_strlen_validator() {
132 let validator = MinStrlenValidator(5);
133 let valid_value = Value::Text(Text("Hello".to_string()));
134 let invalid_value = Value::Text(Text("Hi".to_string()));
135 assert!(validator.validate(&valid_value).is_ok());
136 assert!(validator.validate(&invalid_value).is_err());
137 }
138
139 #[test]
140 fn test_min_strlen_validator_non_text() {
141 let validator = MinStrlenValidator(5);
142 let non_text_value = Value::Uint32(crate::prelude::Uint32(42));
143 assert!(validator.validate(&non_text_value).is_err());
144 }
145
146 #[test]
147 fn test_range_strlen_validator() {
148 let validator = RangeStrlenValidator(3, 10);
149 let valid_value = Value::Text(Text("Hello".to_string()));
150 let too_short_value = Value::Text(Text("Hi".to_string()));
151 let too_long_value = Value::Text(Text("Hello, World!".to_string()));
152 assert!(validator.validate(&valid_value).is_ok());
153 assert!(validator.validate(&too_short_value).is_err());
154 assert!(validator.validate(&too_long_value).is_err());
155 }
156
157 #[test]
158 fn test_range_strlen_validator_non_text() {
159 let validator = RangeStrlenValidator(3, 10);
160 let non_text_value = Value::Uint32(crate::prelude::Uint32(42));
161 assert!(validator.validate(&non_text_value).is_err());
162 }
163}