1use rhai::{Engine, Scope};
2use rhai::Dynamic;
3use crate::types::{User, Resource};
4
5pub fn evaluate_condition(expr: &str, user: &User, resource: &Resource) -> bool {
6 let engine = Engine::new();
8 let mut scope = Scope::new();
9
10 scope.push("user_id", Dynamic::from(user.id.clone()));
12 scope.push("user_roles", Dynamic::from_array(
13 user.roles.iter().map(|r| Dynamic::from(r.clone())).collect()
14 ));
15 scope.push("resource_owner", Dynamic::from(resource.owner_id.clone()));
16 scope.push("resource_name", Dynamic::from(resource.resource_name.clone()));
17 scope.push("resource_type", Dynamic::from(resource.resource_type.clone()));
18
19 match engine.eval_with_scope::<bool>(&mut scope, expr) {
20 Ok(result) => result,
21 Err(e) => {
22 false
24 }
25 }
26}
27