Permeable

Permeable is a permission-demand trait. It helps to decouple the permission-demander from the permission / auth provider.

Example

```rust use permeable::{Permeable, PermissionError};

[allow(dead_code)]

[derive(Copy, Clone, Debug, Eq, PartialEq)]

enum Permission { RoThis, RwThis, AccessThat, }

struct User { name: String }

// A naive implementation of a the Permeable-Trait. impl Permeable for User { type Perm = Permission; fn hasperm(&self, permission: impl Into) -> Result<(), PermissionError> { use Permission::*; match (self.name.asstr(), permission.into()) { ("admin", ) => Ok(()), ("peter", AccessThat) => Ok(()), ("peter", RoThis) => Ok(()), ("paul", RoThis) => Ok(()), ("paul", RwThis) => Ok(()), // catch all (, perm) => Err(PermissionError::denied(format!("{perm:?}"), &self.name)), } } }

use Permission::*;

fn main() { let admin = User { name: String::from("admin") }; asserteq!(admin.hasperm(RwThis), Ok(())); let peter = User { name: String::from("peter") }; asserteq!(peter.hasperm(AccessThat), Ok(())); asserteq!(peter.hasperm(RwThis).is_err(), true); } ```