Skip to main content

ferro_rs/validation/
mod.rs

1//! Request validation for Ferro framework.
2//!
3//! Provides Laravel-inspired validation with declarative rules.
4//!
5//! # Example
6//!
7//! ```rust,ignore
8//! use ferro_rs::validation::{Validator, rules};
9//!
10//! let data = serde_json::json!({
11//!     "email": "user@example.com",
12//!     "password": "secret123",
13//!     "age": 25
14//! });
15//!
16//! let validator = Validator::new(&data)
17//!     .rules("email", rules![required, email])
18//!     .rules("password", rules![required, min(8)])
19//!     .rules("age", rules![required, integer, min(18)]);
20//!
21//! if let Err(errors) = validator.validate() {
22//!     println!("Validation failed: {:?}", errors);
23//! }
24//! ```
25
26mod bridge;
27mod error;
28mod rule;
29mod rules;
30mod validatable;
31mod validator;
32
33pub(crate) use bridge::translate_validation;
34pub use bridge::{register_validation_translator, TranslatorFn};
35pub use error::ValidationError;
36pub use rule::Rule;
37pub use rules::*;
38pub use validatable::Validatable;
39pub use validator::{validate, Validator};
40
41/// Macro for creating a vector of boxed validation rules.
42///
43/// This macro boxes each rule, allowing different rule types to be stored
44/// together in a single vector.
45///
46/// # Example
47///
48/// ```rust,ignore
49/// use ferro_rs::validation::{Validator, rules::*};
50/// use ferro_rs::rules;
51///
52/// let validator = Validator::new(&data)
53///     .rules("email", rules![required(), email()])
54///     .rules("name", rules![required(), string(), max(255)]);
55/// ```
56#[macro_export]
57macro_rules! rules {
58    ($($rule:expr),* $(,)?) => {
59        vec![$(Box::new($rule) as Box<dyn $crate::validation::Rule>),*]
60    };
61}