Skip to main content

access_control/
access_control.rs

1//! Role-based access control with relational composition and image.
2
3use relmath::{BinaryRelation, UnaryRelation};
4
5fn main() {
6    let user_role = BinaryRelation::from_pairs([
7        ("ann", "admin"),
8        ("bob", "analyst"),
9        ("bob", "reviewer"),
10        ("cara", "guest"),
11    ]);
12
13    let role_permission = BinaryRelation::from_pairs([
14        ("admin", "read"),
15        ("admin", "write"),
16        ("admin", "deploy"),
17        ("analyst", "read"),
18        ("reviewer", "approve"),
19        ("guest", "read"),
20    ]);
21
22    let effective_permission = user_role.compose(&role_permission);
23    let bob = UnaryRelation::singleton("bob");
24    let bob_permissions = effective_permission.image(&bob);
25
26    assert!(effective_permission.contains(&"ann", &"deploy"));
27    assert!(bob_permissions.contains(&"approve"));
28    assert!(bob_permissions.contains(&"read"));
29
30    println!(
31        "effective permissions for bob: {:?}",
32        bob_permissions.to_vec()
33    );
34}