use bevy::ecs::system::SystemParam;
use bevy::prelude::*;
use std::io::Read;
use std::time::Duration;
use crate::{CacheConfig, CacheEntry, CacheError, CacheManifest};
#[derive(SystemParam)]
pub struct Cache<'w> {
manifest: ResMut<'w, CacheManifest>,
config: Res<'w, CacheConfig>,
}
impl<'w> Cache<'w> {
pub fn config(&self) -> &CacheConfig {
self.config.as_ref()
}
pub fn manifest(&self) -> &CacheManifest {
self.manifest.as_ref()
}
pub fn manifest_mut(&mut self) -> &mut CacheManifest {
self.manifest.as_mut()
}
pub fn store<R: Read>(
&mut self,
key: &str,
extension: &str,
reader: R,
max_age: Option<Duration>,
) -> Result<(), CacheError> {
self.manifest.store(self.config.as_ref(), key, extension, reader, max_age)
}
pub fn remove(&mut self, key: &str) -> Result<(), CacheError> {
self.manifest.remove(self.config.as_ref(), key)
}
pub fn contains(&self, key: &str) -> bool {
self.manifest.contains(key)
}
pub fn get(&self, key: &str) -> Option<&CacheEntry> {
self.manifest.get(key)
}
pub fn asset_path(&self, key: &str) -> Option<String> {
self.manifest.asset_path(key)
}
pub fn is_cached(&self, key: &str) -> bool {
self.manifest.is_cached(self.config.as_ref(), key)
}
pub fn total_size_bytes(&self) -> u64 {
self.manifest.total_size_bytes()
}
pub fn load<A: Asset>(&self, asset_server: &AssetServer, key: &str) -> Option<Handle<A>> {
self.asset_path(key).map(|path| asset_server.load(path))
}
pub fn load_cached<A: Asset>(
&self,
asset_server: &AssetServer,
key: &str,
) -> Result<Handle<A>, CacheError> {
self.manifest.load_cached(self.config.as_ref(), key, asset_server)
}
#[cfg(feature = "hot_reload")]
pub fn get_if_modified<'a, A: Asset>(
&self,
handle: &Handle<A>,
assets: &'a Assets<A>,
messages: &mut MessageReader<AssetEvent<A>>,
) -> Option<&'a A> {
for event in messages.read() {
if let AssetEvent::Modified { id } = event {
if *id == handle.id() {
return assets.get(handle);
}
}
}
None
}
}