Skip to main content

wasm_dbms_api/dbms/validate/
strlen.rs

1use crate::prelude::{DbmsError, Validate, Value};
2
3/// A validator that checks if the length of a string does not exceed a maximum length.
4///
5/// # Example
6///
7/// ```rust
8/// use wasm_dbms_api::prelude::{MaxStrlenValidator, Validate, Value, Text};
9/// let validator = MaxStrlenValidator(10);
10/// let value = Value::Text(Text("Hello".to_string()));
11/// assert!(validator.validate(&value).is_ok());
12/// let long_value = Value::Text(Text("Hello, World!".to_string()));
13/// assert!(validator.validate(&long_value).is_err());
14/// ```
15pub 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
37/// A validator that checks if the length of a string is at least a minimum length.
38///
39/// # Example
40/// ```rust
41/// use wasm_dbms_api::prelude::{MinStrlenValidator, Validate, Value, Text};
42/// let validator = MinStrlenValidator(5);
43/// let value = Value::Text(Text("Hello".to_string()));
44/// assert!(validator.validate(&value).is_ok());
45/// let short_value = Value::Text(Text("Hi".to_string()));
46/// assert!(validator.validate(&short_value).is_err());
47/// ```
48pub 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
70/// A validator that checks if the length of a string is within a specified range.
71///
72/// # Example
73///
74/// ```rust
75/// use wasm_dbms_api::prelude::{RangeStrlenValidator, Validate, Value, Text};
76/// let validator = RangeStrlenValidator(3, 10);
77/// let value = Value::Text(Text("Hello".to_string()));
78/// assert!(validator.validate(&value).is_ok());
79/// let short_value = Value::Text(Text("Hi".to_string()));
80/// assert!(validator.validate(&short_value).is_err());
81/// let long_value = Value::Text(Text("Hello, World!".to_string()));
82/// assert!(validator.validate(&long_value).is_err());
83/// ```
84pub 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}