use crate::{Runtime, aux::Owned, runtime::model};
use super::{Concept, Entity, Object};
#[derive(Owned!)]
pub enum Create {
Entity(Entity),
Concept(Concept),
Object(Object),
}
impl Runtime {
pub fn create(&mut self, cmd: Create) {
use Create as C;
match cmd {
C::Entity(entity) => {
self.state
.entities
.insert(entity.name.clone(), model::Entity { name: entity.name });
}
C::Concept(concept) => {
let concept = model::Concept {
name: concept.name,
default_price: concept.default_price,
gtin: concept.gtin,
};
if let Some(gtin) = concept.gtin {
self.state.concepts_gtin.insert(gtin, concept.clone());
}
self.state.concepts.insert(concept.name.clone(), concept);
}
C::Object(object) => {
self.state.objects.insert(
object.name.clone(),
model::Object {
name: Some(object.name),
parent: object.parent,
},
);
}
}
}
}
#[cfg(test)]
mod tests {
use crate::{Set, eval};
#[test]
fn inherit() {
let rt = eval(
"
create entity A
create entity B
create concept E price 13.37€ gtin 10000000
create object O parent E
create object T parent E
create entity C
",
)
.unwrap();
assert_eq!(
rt.entities.keys().map(AsRef::as_ref).collect::<Set<_>>(),
["A", "B", "C"].into_iter().collect(),
);
assert_eq!(
rt.to_state()
.objects
.into_values()
.map(|o| (o.name.unwrap(), o.parent.unwrap().name))
.collect::<Set<_>>(),
Set::from([("O".into(), "E".into()), ("T".into(), "E".into())])
);
}
}