use super::{ElementMetadata, ModelElement, Property};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entity {
pub metadata: ElementMetadata,
pub properties: Vec<Property>,
pub extends: Option<String>,
pub is_abstract: bool,
}
impl Entity {
pub fn new(urn: String) -> Self {
Self {
metadata: ElementMetadata::new(urn),
properties: Vec::new(),
extends: None,
is_abstract: false,
}
}
pub fn properties(&self) -> &[Property] {
&self.properties
}
pub fn add_property(&mut self, property: Property) {
self.properties.push(property);
}
pub fn as_abstract(mut self) -> Self {
self.is_abstract = true;
self
}
pub fn extends(mut self, entity_urn: String) -> Self {
self.extends = Some(entity_urn);
self
}
}
impl ModelElement for Entity {
fn urn(&self) -> &str {
&self.metadata.urn
}
fn metadata(&self) -> &ElementMetadata {
&self.metadata
}
}
pub type ComplexType = Entity;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_entity_creation() {
let entity = Entity::new("urn:samm:org.example:1.0.0#TestEntity".to_string());
assert_eq!(entity.name(), "TestEntity");
assert_eq!(entity.properties().len(), 0);
assert!(!entity.is_abstract);
}
#[test]
fn test_abstract_entity() {
let entity =
Entity::new("urn:samm:org.example:1.0.0#AbstractEntity".to_string()).as_abstract();
assert!(entity.is_abstract);
}
#[test]
fn test_entity_inheritance() {
let entity = Entity::new("urn:samm:org.example:1.0.0#DerivedEntity".to_string())
.extends("urn:samm:org.example:1.0.0#BaseEntity".to_string());
assert_eq!(
entity.extends,
Some("urn:samm:org.example:1.0.0#BaseEntity".to_string())
);
}
}