use std::{
collections::HashMap,
path::{Path, PathBuf},
sync::Arc,
};
use crate::{Template, Tileset};
pub type ResourcePath = Path;
pub type ResourcePathBuf = PathBuf;
pub trait ResourceCache {
fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Tileset>>;
fn insert_tileset(&mut self, path: impl AsRef<ResourcePath>, tileset: Arc<Tileset>);
fn get_template(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Template>>;
fn insert_template(&mut self, path: impl AsRef<ResourcePath>, tileset: Arc<Template>);
}
#[derive(Debug, Default)]
pub struct DefaultResourceCache {
pub tilesets: HashMap<ResourcePathBuf, Arc<Tileset>>,
pub templates: HashMap<ResourcePathBuf, Arc<Template>>,
}
impl DefaultResourceCache {
pub fn new() -> Self {
Self {
tilesets: HashMap::new(),
templates: HashMap::new(),
}
}
}
impl ResourceCache for DefaultResourceCache {
fn get_tileset(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Tileset>> {
self.tilesets.get(path.as_ref()).map(Clone::clone)
}
fn insert_tileset(&mut self, path: impl AsRef<ResourcePath>, tileset: Arc<Tileset>) {
self.tilesets.insert(path.as_ref().to_path_buf(), tileset);
}
fn get_template(&self, path: impl AsRef<ResourcePath>) -> Option<Arc<Template>> {
self.templates.get(path.as_ref()).map(Clone::clone)
}
fn insert_template(&mut self, path: impl AsRef<ResourcePath>, tileset: Arc<Template>) {
self.templates.insert(path.as_ref().to_path_buf(), tileset);
}
}