1use rhai::{Engine, Scope};
2use rhai::Dynamic;
3use crate::types::{User, Resource};
4use std::fs::OpenOptions;
5use std::io::Write;
6
7pub fn log_debug(msg: &str) {
8 let mut file = OpenOptions::new()
9 .create(true)
10 .append(true)
11 .open("/tmp/decide-debug.log")
12 .unwrap();
13 writeln!(file, "{}", msg).unwrap();
14}
15
16pub fn evaluate_condition(expr: &str, user: &User, resource: &Resource) -> bool {
17 let engine = Engine::new();
19 let mut scope = Scope::new();
20
21 scope.push("user_id", Dynamic::from(user.id.clone()));
23 scope.push("user_roles", Dynamic::from_array(
24 user.roles.iter().map(|r| Dynamic::from(r.clone())).collect()
25 ));
26 scope.push("resource_owner", Dynamic::from(resource.owner_id.clone()));
27 scope.push("resource_name", Dynamic::from(resource.resource_name.clone()));
28 scope.push("resource_type", Dynamic::from(resource.resource_type.clone()));
29
30 let debug_expr = format!(
32 "DEBUG | expr: `{}`, user_id: `{}`, resource_owner: `{}`",
33 expr, user.id, resource.owner_id
34 );
35 log_debug(&debug_expr);
36
37 match engine.eval_with_scope::<bool>(&mut scope, expr) {
38 Ok(result) => result,
39 Err(e) => {
40 let msg = format!(
42 "⚠️ Rhai error while evaluating: {}\nExpr: {}\nuser_id: {}, resource_owner: {}",
43 e, expr, user.id, resource.owner_id
44 );
45 log_debug(&msg);
46
47 false
49 }
50 }
51}
52