permissions/
permissions.rs1use logify::{Expression, ExpressionBuilder, eval::BoolEval};
2
3fn main() -> Result<(), ()> {
4 let builder = ExpressionBuilder::new();
6
7 let admin = builder.leaf("Admin");
9 let editor = builder.leaf("Editor");
10 let viewer = builder.leaf("Viewer");
11
12 let banned = builder.leaf("Banned");
14 let readonly = builder.leaf("ReadOnly");
15
16 let can_view = (admin | editor | viewer) & !banned;
18 let can_edit = (admin | editor) & !readonly & !banned;
19 let can_delete = admin & !banned;
20
21 builder.add_root(can_view);
23 builder.add_root(can_edit);
24 builder.add_root(can_delete);
25
26 let rules: Expression<&str> = builder.build();
27
28 let mut user_a = BoolEval::new();
32 user_a.add("Editor");
33 user_a.add("Banned");
34
35 let mut user_b = BoolEval::new();
37 user_b.add("Editor");
38 user_b.add("ReadOnly");
39
40 let mut user_c = BoolEval::new();
42 user_c.add("Admin");
43
44 print_access("User A (Banned Editor)", &rules, &mut user_a);
46 print_access("User B (ReadOnly Editor)", &rules, &mut user_b);
47 print_access("User C (Admin)", &rules, &mut user_c);
48
49 Ok(())
50}
51
52fn print_access<'a>(name: &str, rules: &Expression<&'a str>, user: &mut BoolEval<&'a str>) {
53 let perms = rules.evaluate(user).unwrap();
55
56 println!("Permissions for {}:", name);
57 println!(" [View]: {}", perms[0]);
58 println!(" [Edit]: {}", perms[1]);
59 println!(" [Delete]: {}", perms[2]);
60 println!("-----------------------------");
61}