use super::core::{RelationshipContainer, RelationshipLoadingState, TypeSafeRelationship};
use std::fmt::Debug;
pub fn extract_loaded_data<T>(relationships: &[TypeSafeRelationship<T>]) -> Vec<&T>
where
T: Clone + Debug + Send + Sync,
{
relationships
.iter()
.filter_map(|rel| rel.get_typed())
.collect()
}
pub fn count_loaded<T>(relationships: &[TypeSafeRelationship<T>]) -> usize
where
T: Clone + Debug + Send + Sync,
{
relationships.iter().filter(|rel| rel.is_loaded()).count()
}
pub fn get_failed_relationships<T>(relationships: &[TypeSafeRelationship<T>]) -> Vec<(&str, &str)>
where
T: Clone + Debug + Send + Sync,
{
relationships
.iter()
.filter_map(|rel| {
if let RelationshipLoadingState::Failed(error) = rel.loading_state() {
Some((rel.name(), error.as_str()))
} else {
None
}
})
.collect()
}
pub fn set_all_loading<T>(relationships: &mut [TypeSafeRelationship<T>])
where
T: Clone + Debug + Send + Sync,
{
for rel in relationships {
rel.set_loading();
}
}
pub fn all_loaded<T>(relationships: &[TypeSafeRelationship<T>]) -> bool
where
T: Clone + Debug + Send + Sync,
{
!relationships.is_empty() && relationships.iter().all(|rel| rel.is_loaded())
}
pub fn any_loaded<T>(relationships: &[TypeSafeRelationship<T>]) -> bool
where
T: Clone + Debug + Send + Sync,
{
relationships.iter().any(|rel| rel.is_loaded())
}
pub fn reset_all<T>(relationships: &mut [TypeSafeRelationship<T>])
where
T: Clone + Debug + Send + Sync,
{
for rel in relationships {
rel.reset();
}
}
pub fn get_pending_relationships<T>(
relationships: &[TypeSafeRelationship<T>],
) -> Vec<&TypeSafeRelationship<T>>
where
T: Clone + Debug + Send + Sync,
{
relationships
.iter()
.filter(|rel| {
matches!(
rel.loading_state(),
RelationshipLoadingState::NotLoaded | RelationshipLoadingState::Loading
)
})
.collect()
}
pub fn group_by_state<T>(
relationships: &[TypeSafeRelationship<T>],
) -> (
Vec<&TypeSafeRelationship<T>>,
Vec<&TypeSafeRelationship<T>>,
Vec<&TypeSafeRelationship<T>>,
Vec<&TypeSafeRelationship<T>>,
)
where
T: Clone + Debug + Send + Sync,
{
let mut not_loaded = Vec::new();
let mut loading = Vec::new();
let mut loaded = Vec::new();
let mut failed = Vec::new();
for rel in relationships {
match rel.loading_state() {
RelationshipLoadingState::NotLoaded => not_loaded.push(rel),
RelationshipLoadingState::Loading => loading.push(rel),
RelationshipLoadingState::Loaded => loaded.push(rel),
RelationshipLoadingState::Failed(_) => failed.push(rel),
}
}
(not_loaded, loading, loaded, failed)
}