use std::collections::HashMap;
use crate::error::PolicyError;
use crate::types::PermitPolicy;
use cedar_policy::{ParseErrors, PolicyId, PolicySet};
pub fn compile_policy(text: &str) -> Result<PolicySet, PolicyError> {
text.parse()
.map_err(|e: ParseErrors| PolicyError::ParseError(e.to_string()))
}
pub fn precompute_permit_policies(set: &PolicySet) -> HashMap<PolicyId, PermitPolicy> {
set.policies()
.map(|policy| {
let permit_policy = PermitPolicy::new(
policy.to_string(),
policy.to_json().unwrap_or_default(),
policy.id().to_string(),
);
(policy.id().clone(), permit_policy)
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_compile_policy() {
let policy_text = r#"
permit (principal == User::"alice", action == Action::"read", resource == Document::"doc1");
permit (principal == User::"bob", action == Action::"write", resource == Document::"doc2");
"#;
let policy_set = compile_policy(policy_text);
assert!(policy_set.is_ok());
let policy_set = policy_set.unwrap();
assert_eq!(policy_set.num_of_policies(), 2);
}
}