use logify::{Expression, ExpressionBuilder, eval::BoolEval};
fn main() -> Result<(), ()> {
let builder = ExpressionBuilder::new();
let admin = builder.leaf("Admin");
let editor = builder.leaf("Editor");
let viewer = builder.leaf("Viewer");
let banned = builder.leaf("Banned");
let readonly = builder.leaf("ReadOnly");
let can_view = (admin | editor | viewer) & !banned;
let can_edit = (admin | editor) & !readonly & !banned;
let can_delete = admin & !banned;
builder.add_root(can_view);
builder.add_root(can_edit);
builder.add_root(can_delete);
let rules: Expression<&str> = builder.build();
let mut user_a = BoolEval::new();
user_a.add("Editor");
user_a.add("Banned");
let mut user_b = BoolEval::new();
user_b.add("Editor");
user_b.add("ReadOnly");
let mut user_c = BoolEval::new();
user_c.add("Admin");
print_access("User A (Banned Editor)", &rules, &mut user_a);
print_access("User B (ReadOnly Editor)", &rules, &mut user_b);
print_access("User C (Admin)", &rules, &mut user_c);
Ok(())
}
fn print_access<'a>(name: &str, rules: &Expression<&'a str>, user: &mut BoolEval<&'a str>) {
let perms = rules.evaluate(user).unwrap();
println!("Permissions for {}:", name);
println!(" [View]: {}", perms[0]);
println!(" [Edit]: {}", perms[1]);
println!(" [Delete]: {}", perms[2]);
println!("-----------------------------");
}