use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CedarConfig {
pub policy_path: PathBuf,
#[serde(default)]
pub schema_path: Option<PathBuf>,
#[serde(default)]
pub entities_path: Option<PathBuf>,
#[serde(default)]
pub default_decision: DefaultDecision,
#[serde(default = "default_true")]
pub validate_on_load: bool,
#[serde(default, skip_serializing)]
pub policy_store_url: Option<String>,
#[serde(default, skip_serializing)]
pub policy_store_token: Option<String>,
#[serde(skip)]
pub embedded_policy: Option<&'static str>,
#[serde(skip)]
pub embedded_schema: Option<&'static str>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum DefaultDecision {
#[default]
Deny,
Allow,
}
fn default_true() -> bool {
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_decision_values() {
assert_eq!(DefaultDecision::Deny, DefaultDecision::default());
assert_ne!(DefaultDecision::Allow, DefaultDecision::Deny);
}
#[test]
fn test_cedar_config_construction() {
let config = CedarConfig {
policy_path: PathBuf::from("/etc/pep/policies.cedar"),
schema_path: Some(PathBuf::from("/etc/pep/schema.cedarschema")),
entities_path: None,
default_decision: DefaultDecision::Deny,
validate_on_load: true,
policy_store_url: None,
policy_store_token: None,
embedded_policy: None,
embedded_schema: None,
};
assert_eq!(config.policy_path, PathBuf::from("/etc/pep/policies.cedar"));
assert!(config.schema_path.is_some());
assert!(config.entities_path.is_none());
assert_eq!(config.default_decision, DefaultDecision::Deny);
assert!(config.validate_on_load);
}
#[test]
fn test_cedar_config_allow_default() {
let config = CedarConfig {
policy_path: PathBuf::from("policies.cedar"),
schema_path: None,
entities_path: None,
default_decision: DefaultDecision::Allow,
validate_on_load: false,
policy_store_url: None,
policy_store_token: None,
embedded_policy: None,
embedded_schema: None,
};
assert_eq!(config.default_decision, DefaultDecision::Allow);
assert!(!config.validate_on_load);
}
}