pub struct ApplicationValidator { /* private fields */ }Expand description
High-level builder pattern validator for application startup validation.
This is a high-level interface for validating permissions from multiple sources during application initialization. It provides an ergonomic API for collecting permissions incrementally before validation.
§Use Cases
- Application startup: Validate permissions loaded from config, database, etc.
- Simple validation workflows: Need basic validation with automatic logging
- Builder pattern preference: Want to incrementally add permissions from different sources
- One-time validation: Don’t need post-validation analysis
§Compared to PermissionCollisionChecker
- State: Stateless builder - consumed during validation
- Usage: Builder pattern with incremental permission addition
- Methods: Focus on building and validating, no post-validation introspection
- Lifecycle: Single-use - transforms into validation report
- Logging: Automatically logs validation results
For runtime validation or when you need to analyze collision details after validation,
use PermissionCollisionChecker directly.
§See Also
PermissionCollisionChecker- Low-level validator with detailed analysis capabilities
§Examples
§Application startup validation
use axum_gate::permissions::ApplicationValidator;
// Collect permissions from multiple sources during startup
let config_permissions = load_config_permissions();
let db_permissions = load_db_permissions().await?;
let report = ApplicationValidator::new()
.add_permissions(config_permissions)
.add_permissions(db_permissions)
.add_permission("system:health") // Add individual permissions
.validate()?; // Automatically logs results
if report.is_valid() {
println!("✓ All permissions validated - server can start");
} else {
return Err(format!("Permission validation failed: {}", report.summary()).into());
}§Simple validation workflow
use axum_gate::permissions::ApplicationValidator;
// For simple cases where you just need pass/fail validation
let report = ApplicationValidator::new()
.add_permissions(["user:read", "user:write", "admin:delete"])
.validate()?;
// Report is automatically logged, just check if valid
if !report.is_valid() {
panic!("Invalid permissions detected during startup");
}§Comparison with PermissionCollisionChecker
use axum_gate::permissions::{ApplicationValidator, PermissionCollisionChecker};
let permissions = vec!["user:read".to_string(), "user:write".to_string()];
// ApplicationValidator: Builder pattern, single-use, automatic logging
let report1 = ApplicationValidator::new()
.add_permissions(permissions.clone())
.validate()?; // Validator is consumed here
// Can't use validator anymore, but don't need to
// PermissionCollisionChecker: Direct instantiation, reusable, manual control
let mut checker = PermissionCollisionChecker::new(permissions);
let report2 = checker.validate()?; // Checker is still available
// Can continue using checker for analysis
if !report2.is_valid() {
let conflicts = checker.get_conflicting_permissions("user:read");
println!("Conflicts found: {:?}", conflicts);
}Implementations§
Source§impl ApplicationValidator
impl ApplicationValidator
Sourcepub fn add_permissions<I, S>(self, permissions: I) -> Self
pub fn add_permissions<I, S>(self, permissions: I) -> Self
Add permissions from an iterator of string-like types.
§Arguments
permissions- Iterator of items that can be converted to String
Sourcepub fn add_permission_strings(self, permissions: Vec<String>) -> Self
pub fn add_permission_strings(self, permissions: Vec<String>) -> Self
Add permissions from a vector of strings.
This is a convenience method for adding permissions that are already in String format.
§Arguments
permissions- Vector of permission strings
Sourcepub fn add_permission<S: Into<String>>(self, permission: S) -> Self
pub fn add_permission<S: Into<String>>(self, permission: S) -> Self
Sourcepub fn validate(self) -> Result<ValidationReport>
pub fn validate(self) -> Result<ValidationReport>
Validate all permissions and return detailed report.
This method performs validation and logs results automatically. It returns a ValidationReport containing all validation details, regardless of whether validation passed or failed.
§Returns
Ok(ValidationReport)- Complete validation reportErr(axum_gate::errors::Error)- Validation process failed
Sourcepub fn permission_count(&self) -> usize
pub fn permission_count(&self) -> usize
Returns the current number of permissions to be validated.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for ApplicationValidator
impl RefUnwindSafe for ApplicationValidator
impl Send for ApplicationValidator
impl Sync for ApplicationValidator
impl Unpin for ApplicationValidator
impl UnwindSafe for ApplicationValidator
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more