use std::sync::Arc;
use reactive_core::ReadSignal;
use renderer_assets::SvgData;
#[derive(Clone, Debug)]
pub enum AssetState<T> {
Loading,
Ready(T),
Failed,
}
impl<T> PartialEq for AssetState<std::sync::Arc<T>> {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(AssetState::Loading, AssetState::Loading) => true,
(AssetState::Failed, AssetState::Failed) => true,
(AssetState::Ready(a), AssetState::Ready(b)) => std::sync::Arc::ptr_eq(a, b),
_ => false,
}
}
}
impl<T> AssetState<T> {
pub fn is_ready(&self) -> bool {
matches!(self, AssetState::Ready(_))
}
pub fn as_ready(&self) -> Option<&T> {
match self {
AssetState::Ready(value) => Some(value),
_ => None,
}
}
pub fn into_ready(self) -> Option<T> {
match self {
AssetState::Ready(value) => Some(value),
_ => None,
}
}
}
pub trait AssetSource {
fn svg(&self, id: &str) -> ReadSignal<AssetState<Arc<SvgData>>>;
fn svg_or(&self, id: &str, fallback: impl FnOnce() -> Arc<SvgData>) -> Arc<SvgData> {
match self.svg(id).get() {
AssetState::Ready(data) => data,
_ => fallback(),
}
}
}