#![allow(clippy::use_self, reason = "readability")]
use super::models;
use cedar_policy_core::{ast, entities, extensions};
impl From<models::Entities> for entities::Entities {
#[expect(clippy::expect_used, reason = "experimental feature")]
fn from(v: models::Entities) -> Self {
let entities: Vec<ast::Entity> = v.entities.into_iter().map(ast::Entity::from).collect();
entities::Entities::from_entities(
entities,
None::<&entities::NoEntitiesSchema>,
entities::TCComputation::AssumeAlreadyComputed,
extensions::Extensions::all_available(),
)
.expect("protobuf entities should be valid")
}
}
impl From<&entities::Entities> for models::Entities {
fn from(v: &entities::Entities) -> Self {
assert!(
!v.is_partial(),
"protobuf does not support encoding partial Entities"
);
Self {
entities: v.iter().map(models::Entity::from).collect(),
}
}
}
#[cfg(test)]
mod test {
use super::*;
use cedar_policy_core::assert_deep_eq;
use smol_str::SmolStr;
use std::collections::{BTreeMap, HashMap, HashSet};
use std::sync::Arc;
#[test]
fn entities_roundtrip() {
let entities1 = entities::Entities::new();
assert_deep_eq!(
entities1,
entities::Entities::from(models::Entities::from(&entities1))
);
let attrs = (1..=7)
.map(|id| (format!("{id}").into(), ast::RestrictedExpr::val(true)))
.collect::<HashMap<SmolStr, _>>();
let entity = Arc::new(
ast::Entity::new(
r#"Foo::"bar""#.parse().unwrap(),
attrs.clone(),
HashSet::new(),
HashSet::new(),
BTreeMap::new(),
extensions::Extensions::none(),
)
.unwrap(),
);
let mut entities2 = entities::Entities::new();
entities2 = entities2
.add_entities(
[entity.clone()],
None::<&entities::NoEntitiesSchema>,
entities::TCComputation::AssumeAlreadyComputed,
extensions::Extensions::none(),
)
.unwrap();
assert_deep_eq!(
entities2,
entities::Entities::from(models::Entities::from(&entities2))
);
let entity2 = Arc::new(
ast::Entity::new(
r#"Bar::"foo""#.parse().unwrap(),
attrs,
HashSet::new(),
HashSet::new(),
BTreeMap::new(),
extensions::Extensions::none(),
)
.unwrap(),
);
let mut entities3 = entities::Entities::new();
entities3 = entities3
.add_entities(
[entity, entity2],
None::<&entities::NoEntitiesSchema>,
entities::TCComputation::AssumeAlreadyComputed,
extensions::Extensions::none(),
)
.unwrap();
assert_deep_eq!(
entities3,
entities::Entities::from(models::Entities::from(&entities3))
);
}
}