use crate::proxy::{ProxyError, ProxyResult, ScalarValue};
use std::any::Any;
pub trait OrmReflectable: 'static {
fn clone_relationship(&self, name: &str) -> Option<Box<dyn Any + 'static>>;
fn get_relationship_mut_ref(&mut self, name: &str) -> Option<&mut dyn Any>;
fn get_field_value(&self, name: &str) -> Option<ScalarValue>;
fn set_field_value(&mut self, name: &str, value: ScalarValue) -> ProxyResult<()>;
}
impl<T: OrmReflectable> super::reflection::Reflectable for T {
fn get_relationship(&self, name: &str) -> Option<Box<dyn Any + 'static>> {
self.clone_relationship(name)
}
fn get_relationship_mut(&mut self, name: &str) -> Option<&mut dyn Any> {
self.get_relationship_mut_ref(name)
}
fn get_attribute(&self, name: &str) -> Option<ScalarValue> {
self.get_field_value(name)
}
fn set_attribute(&mut self, name: &str, value: ScalarValue) -> ProxyResult<()> {
self.set_field_value(name, value)
}
fn set_relationship_attribute(
&mut self,
relationship: &str,
attribute: &str,
value: ScalarValue,
) -> ProxyResult<()> {
let rel = self
.get_relationship_mut(relationship)
.ok_or_else(|| ProxyError::RelationshipNotFound(relationship.to_string()))?;
if let Some(related) = rel.downcast_mut::<Box<dyn super::reflection::Reflectable>>() {
related.set_attribute(attribute, value)?;
Ok(())
} else {
Err(ProxyError::TypeMismatch {
expected: "Box<dyn Reflectable>".to_string(),
actual: "unknown".to_string(),
})
}
}
}