use super::super::metadata::RelationshipMetadata;
use super::core::{RelationshipContainer, TypeSafeRelationship};
use std::fmt::Debug;
#[derive(Debug, Clone)]
pub struct MorphOne<T>
where
T: Clone + Debug + Send + Sync,
{
relationship: TypeSafeRelationship<Option<T>>,
morph_type: Option<String>,
morph_id: Option<String>,
}
impl<T> MorphOne<T>
where
T: Clone + Debug + Send + Sync,
{
pub fn new(metadata: RelationshipMetadata) -> Self {
Self {
relationship: TypeSafeRelationship::new(metadata),
morph_type: None,
morph_id: None,
}
}
pub fn set_morph_info(&mut self, morph_type: String, morph_id: String) {
self.morph_type = Some(morph_type);
self.morph_id = Some(morph_id);
}
pub fn morph_type(&self) -> Option<&str> {
self.morph_type.as_deref()
}
pub fn morph_id(&self) -> Option<&str> {
self.morph_id.as_deref()
}
pub fn get(&self) -> Option<&Option<T>> {
self.relationship.get_typed()
}
pub fn is_loaded(&self) -> bool {
self.relationship.is_loaded()
}
pub fn set_loaded(&mut self, data: Option<T>) {
self.relationship.set_loaded(data);
}
pub fn set_loading(&mut self) {
self.relationship.set_loading();
}
pub fn set_failed(&mut self, error: String) {
self.relationship.set_failed(error);
}
pub fn metadata(&self) -> &RelationshipMetadata {
self.relationship.metadata()
}
pub fn name(&self) -> &str {
self.relationship.name()
}
}
#[derive(Debug, Clone)]
pub struct MorphMany<T>
where
T: Clone + Debug + Send + Sync,
{
relationship: TypeSafeRelationship<Vec<T>>,
morph_type: Option<String>,
}
impl<T> MorphMany<T>
where
T: Clone + Debug + Send + Sync,
{
pub fn new(metadata: RelationshipMetadata) -> Self {
Self {
relationship: TypeSafeRelationship::new(metadata),
morph_type: None,
}
}
pub fn set_morph_type(&mut self, morph_type: String) {
self.morph_type = Some(morph_type);
}
pub fn morph_type(&self) -> Option<&str> {
self.morph_type.as_deref()
}
pub fn get(&self) -> Option<&Vec<T>> {
self.relationship.get_typed()
}
pub fn is_loaded(&self) -> bool {
self.relationship.is_loaded()
}
pub fn set_loaded(&mut self, data: Vec<T>) {
self.relationship.set_loaded(data);
}
pub fn set_loading(&mut self) {
self.relationship.set_loading();
}
pub fn set_failed(&mut self, error: String) {
self.relationship.set_failed(error);
}
pub fn metadata(&self) -> &RelationshipMetadata {
self.relationship.metadata()
}
pub fn name(&self) -> &str {
self.relationship.name()
}
pub fn len(&self) -> usize {
self.get().map(|v| v.len()).unwrap_or(0)
}
pub fn is_empty(&self) -> bool {
self.get().map(|v| v.is_empty()).unwrap_or(true)
}
}