waddling_sequences/input_validation.rs
1//! Input/Data Validation sequences (001-010)
2//!
3//! These sequences cover errors related to data validation, format checking,
4//! and input processing according to WDP-6 conventions.
5//!
6//! **Reference:** WDP Part 6: Sequence Conventions (WDP-6) ยง4.1
7
8/// **001** - MISSING
9///
10/// Required data not provided.
11///
12/// **WDP-6:** Required data not provided | Parameter missing, field empty, resource not supplied
13///
14/// # Common Uses
15/// - Missing required parameter
16/// - Missing configuration value
17/// - Missing required field
18/// - Missing file or resource
19///
20/// # Examples
21/// ```rust
22/// use waddling_sequences::input_validation::MISSING;
23///
24/// const ERR_MISSING_PARAM: u16 = MISSING;
25/// // "Parameter 'username' is required but missing"
26/// ```
27pub const MISSING: u16 = 1;
28
29/// **002** - MISMATCH
30///
31/// Type or length mismatch.
32///
33/// **WDP-6:** Type or length mismatch | Type error, size mismatch, format disagreement
34///
35/// # Common Uses
36/// - Type mismatch
37/// - Length mismatch
38/// - Format mismatch
39/// - Checksum mismatch
40///
41/// # Examples
42/// ```rust
43/// use waddling_sequences::input_validation::MISMATCH;
44///
45/// const ERR_TYPE_MISMATCH: u16 = MISMATCH;
46/// // "Expected type 'String', found 'Integer'"
47/// ```
48pub const MISMATCH: u16 = 2;
49
50/// **003** - INVALID
51///
52/// Validation check failed.
53///
54/// **WDP-6:** Validation check failed | Format invalid, checksum failed, constraint violated
55///
56/// # Common Uses
57/// - Invalid syntax
58/// - Invalid format
59/// - Validation failure
60/// - Regex doesn't match
61///
62/// # Examples
63/// ```rust
64/// use waddling_sequences::input_validation::INVALID;
65///
66/// const ERR_INVALID_EMAIL: u16 = INVALID;
67/// // "Email format is invalid"
68/// ```
69pub const INVALID: u16 = 3;
70
71/// **004** - OVERFLOW
72///
73/// Value too large.
74///
75/// **WDP-6:** Value too large | Buffer overflow, numeric overflow, size exceeded
76///
77/// # Common Uses
78/// - Integer overflow
79/// - Buffer overflow
80/// - Capacity exceeded
81/// - Too many items
82///
83/// # Examples
84/// ```rust
85/// use waddling_sequences::input_validation::OVERFLOW;
86///
87/// const ERR_BUFFER_OVERFLOW: u16 = OVERFLOW;
88/// // "Buffer capacity exceeded: max 1024 bytes"
89/// ```
90pub const OVERFLOW: u16 = 4;
91
92/// **005** - UNDERFLOW
93///
94/// Value too small.
95///
96/// **WDP-6:** Value too small | Buffer underflow, numeric underflow, below minimum
97///
98/// # Common Uses
99/// - Integer underflow
100/// - Minimum not met
101/// - Too few items
102/// - Below threshold
103///
104/// # Examples
105/// ```rust
106/// use waddling_sequences::input_validation::UNDERFLOW;
107///
108/// const ERR_MIN_LENGTH: u16 = UNDERFLOW;
109/// // "Password must be at least 8 characters"
110/// ```
111pub const UNDERFLOW: u16 = 5;
112
113/// **006** - OUT_OF_BOUNDS
114///
115/// Outside valid range.
116///
117/// **WDP-6:** Outside valid range | Index out of bounds, value outside range
118///
119/// # Common Uses
120/// - Array index out of bounds
121/// - Value not in valid range
122/// - Outside acceptable limits
123///
124/// # Examples
125/// ```rust
126/// use waddling_sequences::input_validation::OUT_OF_BOUNDS;
127///
128/// const ERR_INDEX_OOB: u16 = OUT_OF_BOUNDS;
129/// // "Index 42 out of bounds (length: 10)"
130/// ```
131pub const OUT_OF_BOUNDS: u16 = 6;
132
133/// **007** - DUPLICATE
134///
135/// Duplicate entry.
136///
137/// **WDP-6:** Duplicate entry | Unique constraint violation, duplicate key
138///
139/// # Common Uses
140/// - Rate limit exceeded
141/// - Duplicate key/entry
142/// - Deduplication needed
143/// - Too many requests
144///
145/// # Examples
146/// ```rust
147/// use waddling_sequences::input_validation::DUPLICATE;
148///
149/// const BLOCKED_RATELIMIT: u16 = DUPLICATE;
150/// // "Rate limit exceeded: 100 requests per minute"
151/// ```
152pub const DUPLICATE: u16 = 7;
153
154/// **008** - DENIED
155///
156/// Permission denied.
157///
158/// **WDP-6:** Permission denied | Authorization failed, access forbidden
159///
160/// # Common Uses
161/// - Permission denied
162/// - Access denied
163/// - Authentication failed
164/// - Authorization failed
165///
166/// # Examples
167/// ```rust
168/// use waddling_sequences::input_validation::DENIED;
169///
170/// const ERR_ACCESS_DENIED: u16 = DENIED;
171/// // "Access denied: insufficient permissions"
172/// ```
173pub const DENIED: u16 = 8;
174
175/// **009** - UNSUPPORTED
176///
177/// Feature not supported.
178///
179/// **WDP-6:** Feature not supported | Unsupported operation, not implemented
180///
181/// # Common Uses
182/// - Feature not implemented
183/// - Platform not supported
184/// - Version not supported
185/// - Operation not allowed
186///
187/// # Examples
188/// ```rust
189/// use waddling_sequences::input_validation::UNSUPPORTED;
190///
191/// const ERR_UNSUPPORTED_OS: u16 = UNSUPPORTED;
192/// // "Operation not supported on Windows"
193/// ```
194pub const UNSUPPORTED: u16 = 9;
195
196/// **010** - DEPRECATED
197///
198/// Feature deprecated.
199///
200/// **WDP-6:** Feature deprecated | Deprecated API, obsolete feature (warning)
201///
202/// # Common Uses
203/// - Deprecated API
204/// - Deprecated syntax
205/// - Legacy feature
206/// - Scheduled for removal
207///
208/// # Examples
209/// ```rust
210/// use waddling_sequences::input_validation::DEPRECATED;
211///
212/// const WARN_DEPRECATED_API: u16 = DEPRECATED;
213/// // "Function 'old_api()' is deprecated, use 'new_api()' instead"
214/// ```
215pub const DEPRECATED: u16 = 10;
216
217#[cfg(test)]
218mod tests {
219 use super::*;
220
221 #[test]
222 fn test_sequence_values() {
223 assert_eq!(MISSING, 1);
224 assert_eq!(MISMATCH, 2);
225 assert_eq!(INVALID, 3);
226 assert_eq!(OVERFLOW, 4);
227 assert_eq!(UNDERFLOW, 5);
228 assert_eq!(OUT_OF_BOUNDS, 6);
229 assert_eq!(DUPLICATE, 7);
230 assert_eq!(DENIED, 8);
231 assert_eq!(UNSUPPORTED, 9);
232 assert_eq!(DEPRECATED, 10);
233 }
234
235 #[test]
236 fn test_sequences_in_range() {
237 let sequences = [
238 MISSING,
239 MISMATCH,
240 INVALID,
241 OVERFLOW,
242 UNDERFLOW,
243 OUT_OF_BOUNDS,
244 DUPLICATE,
245 DENIED,
246 UNSUPPORTED,
247 DEPRECATED,
248 ];
249
250 for &seq in &sequences {
251 assert!(
252 (1..=10).contains(&seq),
253 "Input/Data Validation sequences must be in range 001-010"
254 );
255 }
256 }
257
258 #[test]
259 fn test_sequences_are_unique() {
260 let sequences = [
261 MISSING,
262 MISMATCH,
263 INVALID,
264 OVERFLOW,
265 UNDERFLOW,
266 OUT_OF_BOUNDS,
267 DUPLICATE,
268 DENIED,
269 UNSUPPORTED,
270 DEPRECATED,
271 ];
272
273 for (i, &seq1) in sequences.iter().enumerate() {
274 for &seq2 in sequences.iter().skip(i + 1) {
275 assert_ne!(seq1, seq2, "Sequences must be unique");
276 }
277 }
278 }
279}