use crate::asset::Wisp;
use bevy_asset::AssetLoadFailedEvent;
use bevy_asset::prelude::{AssetEvent, AssetServer};
use bevy_ecs::prelude::*;
use bevy_log::error;
use std::collections::BTreeMap;
#[derive(Resource, Clone, Debug, Default, PartialEq)]
pub struct WispErrors {
pub load: BTreeMap<String, String>,
pub pipeline: BTreeMap<String, String>,
}
impl WispErrors {
pub fn is_empty(&self) -> bool {
self.load.is_empty() && self.pipeline.is_empty()
}
}
pub(crate) fn collect_load_errors(
mut failed: MessageReader<AssetLoadFailedEvent<Wisp>>,
mut events: MessageReader<AssetEvent<Wisp>>,
asset_server: Res<AssetServer>,
mut errors: ResMut<WispErrors>,
) {
for event in failed.read() {
let path = event.path.to_string();
let message = event.error.to_string();
if errors.load.get(&path) != Some(&message) {
error!("failed to load wisp `{path}`:\n{message}");
errors.load.insert(path, message);
}
}
for event in events.read() {
if let AssetEvent::LoadedWithDependencies { id } | AssetEvent::Modified { id } = event
&& let Some(path) = asset_server.get_path(*id)
{
errors.load.remove(&path.to_string());
}
}
}