| Crates.io | validate-ro |
| lib.rs | validate-ro |
| version | 0.3.2 |
| created_at | 2025-05-24 05:01:32.41852+00 |
| updated_at | 2025-07-22 15:12:32.967039+00 |
| description | A flexible validation framework with sync/async support and MongoDB integration |
| homepage | |
| repository | https://github.com/kak-smko/validate-ro |
| max_upload_size | |
| id | 1687023 |
| size | 134,150 |
A flexible, extensible validation framework for Rust with support for both synchronous and asynchronous validation, including MongoDB integration for unique checks.
Add to your Cargo.toml:
[dependencies]
validate-ro = "0.1"
use validate_ro::{FormValidator,Rules,rules, rules::Rule};
use serde_json::json;
fn main() {
// Build a validator
let validator = FormValidator::new()
.add("username", Rules::new().add(Rule::required()).add(Rule::min_length(5)))
.add("email", rules![Rule::required(),Rule::email(None)])
.add("age", Rules::new().add(Rule::integer()).add(Rule::min_value(18.0)).default(json!(21)));
// Validate some data
let data = json!({
"username": "user123",
"email": "test@example.com"
});
match validator.validate(&data) {
Ok(valid_data) => {
println!("Valid data: {:?}", valid_data); // age will be 21 (default)
},
Err(errors) => {
eprintln!("Validation errors: {:?}", errors);
}
}
}
use validate_ro::Rules;
use validate_ro::rules::Rule;
// Single field validation
let is_adult = Rules::new().add(Rule::integer()).add(Rule::min_value(18.0));
assert!(is_adult.validate(&json!(21)).is_ok());
// or use macro
let is_adult = rules![Rule::integer(),Rule::min_value(18.0)];
assert!(is_adult.validate(&json!(21)).is_ok());
let password_validator = Rules::new().add(Rule::required())
.add(Rule::min_length(8))
.add(Rule::regex(r"[A-Z]", Some("Must contain uppercase".into())).unwrap());
let form_validator = FormValidator::new()
.add("user.name", Rule::required())
.add("user.email", Rule::email(None))
.add("user.age", Rule::integer());
#[tokio::main]
async fn main() {
let client = mongodb::Client::with_uri_str("mongodb://localhost:27017").await.unwrap();
let db = Arc::new(client.database("test"));
let validator = FormValidator::new()
.add("email", Rule::unique("users", "email", None));
let result = validator.validate_async(&db, &json!({"email": "user@example.com"})).await;
}
required() - Field must be present and not nullstring() - Must be a stringinteger() - Must be an integerfloat() - Must be a floatboolean() - Must be a booleanarray() - Must be an arrayobject() - Must be an objectlength(n) - Exact lengthmin_length(n) - Minimum lengthmax_length(n) - Maximum lengthemail() - Valid email formaturl() - Valid URL formatip() - Valid IP addressregex() - Matches regex patternaccepted() - Common "accepted" terms (true, 1, "yes", "on")min_value(n) - Minimum valuemax_value(n) - Maximum valueequal(n) - Exact value matchnumeric() - Can be parsed as numberin_values() - Value must be in allowed setnot_in_values() - Value must not be in excluded setunique() - Field value must be unique in MongoDB collectionextensions() - File extension must be in allowed setlet validator = Rule::custom(|value| {
if let Some(s) = value.as_str() {
if s.starts_with("prefix_") {
Ok(())
} else {
Err(ValidationError::Custom("Must start with 'prefix_'".into()))
}
} else {
Err(ValidationError::TypeError {
expected: "string".into(),
got: value.to_string()
})
}
});
match validator.validate(&data) {
Ok(valid_data) => { /* handle success */ },
Err(errors) => {
for (field, field_errors) in errors {
println!("Field '{}' errors:", field);
for error in field_errors {
println!("- {}", error);
}
}
}
}
The library is designed for efficiency:
Minimal allocations
Lazy validation (stops on first error when configured)
Thread-safe by design
Contributions are welcome! Please open an issue or submit a PR for:
New features
Performance improvements
Bug fixes
Dual-licensed under MIT or Apache 2.0 at your option.