PermissionCollisionChecker

Struct PermissionCollisionChecker 

Source
pub struct PermissionCollisionChecker { /* private fields */ }
Expand description

Low-level permission collision checker for runtime validation and analysis.

This checker validates permission strings for duplicates and hash collisions, providing detailed reports about any issues found. Unlike the compile-time validation, this can handle dynamic permission strings.

§Use Cases

  • Runtime validation: When permissions change during application lifecycle
  • Debugging and analysis: Need to inspect collision maps and conflicts
  • Custom validation workflows: Require fine-grained control over validation process
  • Performance-critical paths: Direct validation without builder overhead

§Compared to ApplicationValidator

  • State: Stateful - maintains collision map for post-validation analysis
  • Usage: Direct instantiation with complete permission set
  • Methods: Provides introspection methods like get_conflicting_permissions()
  • Lifecycle: Can be reused after validation for analysis

For simple application startup validation, consider using ApplicationValidator which provides a more ergonomic builder pattern API.

§See Also

§Examples

§Basic validation with post-analysis

use axum_gate::permissions::PermissionCollisionChecker;

let permissions = vec![
    "user:read".to_string(),
    "user:write".to_string(),
    "admin:full_access".to_string(),
];

let mut checker = PermissionCollisionChecker::new(permissions);
let report = checker.validate()?;

if report.is_valid() {
    println!("All permissions are valid!");
    // Can still use checker for analysis after validation
    println!("Total permissions: {}", checker.permission_count());
    println!("Unique IDs: {}", checker.unique_id_count());
} else {
    println!("Issues found: {}", report.summary());
    // Check for specific conflicts
    let conflicts = checker.get_conflicting_permissions("user:read");
    if !conflicts.is_empty() {
        println!("Conflicts with user:read: {:?}", conflicts);
    }
}

§Runtime permission updates

use axum_gate::permissions::PermissionCollisionChecker;

fn update_permissions(new_permissions: Vec<String>) -> Result<(), Box<dyn std::error::Error>> {
    let mut checker = PermissionCollisionChecker::new(new_permissions);
    let report = checker.validate()?;

    if !report.is_valid() {
        // Can analyze specific issues
        for collision in &report.collisions {
            println!("Hash ID {} has conflicts: {:?}", collision.id, collision.permissions);
        }
        return Err("Permission validation failed".into());
    }

    // Validation passed - can still inspect the checker
    let summary = checker.get_permission_summary();
    println!("Permission distribution: {:?}", summary);
    Ok(())
}

Implementations§

Source§

impl PermissionCollisionChecker

Source

pub fn new(permissions: Vec<String>) -> Self

Creates a new collision checker with the given permission strings.

§Arguments
  • permissions - Vector of permission strings to validate
Source

pub fn validate(&mut self) -> Result<ValidationReport>

Validates all permissions for uniqueness and collision-free hashing.

This method performs comprehensive validation including:

  • Duplicate string detection
  • Hash collision detection
  • Internal collision map building
§Returns
  • Ok(ValidationReport) - Detailed report of validation results
  • Err(axum_gate::errors::Error) - If validation process itself fails
§Examples
use axum_gate::permissions::PermissionCollisionChecker;

let permissions = vec!["read:file".to_string(), "write:file".to_string()];
let mut checker = PermissionCollisionChecker::new(permissions);

match checker.validate() {
    Ok(report) => {
        if report.is_valid() {
            println!("Validation passed!");
        } else {
            eprintln!("Validation failed: {}", report.summary());
        }
    }
    Err(e) => eprintln!("Validation error: {}", e),
}
Source

pub fn get_conflicting_permissions(&self, permission: &str) -> Vec<String>

Returns permissions that hash to the same ID as the given permission.

This method is useful for debugging collision issues or understanding how permissions map to hash IDs.

§Arguments
  • permission - The permission string to check for conflicts
§Returns

Vector of permission strings that conflict with the given permission. The returned vector will not include the input permission itself.

Source

pub fn get_permission_summary(&self) -> HashMap<u64, Vec<String>>

Returns a summary of all permissions grouped by their hash ID.

This method provides a complete view of how permissions are distributed across hash IDs, which can be useful for analysis and debugging.

§Returns

HashMap where keys are hash IDs and values are vectors of permission strings that hash to that ID.

Source

pub fn permission_count(&self) -> usize

Returns the total number of permissions being validated.

Source

pub fn unique_id_count(&self) -> usize

Returns the number of unique hash IDs generated from the permissions.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

Source§

fn is_within(&self, b: &G2) -> bool

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,