use astrelis_assets::{AssetLoader, AssetServer};
use crate::plugin::Plugin;
use crate::resource::Resources;
#[cfg(feature = "text")]
use astrelis_text::FontLoader;
#[derive(Default)]
pub struct AssetPlugin {
pub base_path: Option<String>,
}
impl AssetPlugin {
pub fn new() -> Self {
Self::default()
}
pub fn with_base_path(mut self, path: impl Into<String>) -> Self {
self.base_path = Some(path.into());
self
}
}
impl Plugin for AssetPlugin {
type Dependencies = ();
fn name(&self) -> &'static str {
"AssetPlugin"
}
fn build(&self, resources: &mut Resources) {
let mut server = match &self.base_path {
Some(path) => AssetServer::with_base_path(path),
None => AssetServer::new(),
};
server.register_loader(astrelis_assets::TextLoader);
server.register_loader(astrelis_assets::BytesLoader);
#[cfg(feature = "text")]
server.register_loader(FontLoader);
tracing::debug!("AssetPlugin: Registered default loaders");
resources.insert(server);
}
}
#[allow(dead_code)]
pub trait AssetServerExt {
fn register_loader<L: AssetLoader>(&mut self, loader: L)
where
L::Asset: astrelis_assets::Asset;
}
impl AssetServerExt for crate::Engine {
fn register_loader<L: AssetLoader>(&mut self, loader: L)
where
L::Asset: astrelis_assets::Asset,
{
if let Some(server) = self.get_mut::<AssetServer>() {
server.register_loader(loader);
} else {
tracing::warn!("AssetServer not found - is AssetPlugin added?");
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::EngineBuilder;
#[test]
fn test_asset_plugin_registers_server() {
let engine = EngineBuilder::new()
.add_plugin(AssetPlugin::default())
.build();
assert!(engine.get::<AssetServer>().is_some());
}
#[test]
fn test_asset_plugin_with_base_path() {
let engine = EngineBuilder::new()
.add_plugin(AssetPlugin::new().with_base_path("assets"))
.build();
assert!(engine.get::<AssetServer>().is_some());
}
#[test]
fn test_default_loaders_registered() {
let engine = EngineBuilder::new()
.add_plugin(AssetPlugin::default())
.build();
let server = engine.get::<AssetServer>().unwrap();
assert!(server.has_loader_for::<String>("txt"));
assert!(server.has_loader_for::<Vec<u8>>("bin"));
}
}