decide_core/
utils.rs

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    // Create engine and scope
18    let engine = Engine::new();
19    let mut scope = Scope::new();
20
21    // Exposing fields for user to use in conditions
22    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    // Logging to file
31    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            // Logging to file
41            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            // Return value
48            false
49        }
50    }
51}
52