use super::LoaderError;
use crate::{App, Context};
use alloc::{
boxed::Box,
string::{String, ToString},
vec::Vec,
};
#[derive(Clone, Debug)]
pub struct Asset {
pub relative_path: String,
pub result: Result<Vec<u8>, LoaderError>,
}
impl Asset {
pub fn new_ok(relative_path: String, contents: Vec<u8>) -> Asset {
Asset {
relative_path,
result: Ok(contents),
}
}
pub fn new_err(relative_path: String, error: LoaderError) -> Asset {
Asset {
relative_path,
result: Err(error),
}
}
}
pub(crate) struct AssetRequest<A: App> {
pub assets: Vec<Asset>,
pub callback: Box<dyn FnMut(&mut Context<A>, &mut A, Vec<Asset>) + 'static>,
}
unsafe impl<A: App> Send for AssetRequest<A> {}
impl<A: App> AssetRequest<A> {
pub(crate) fn new<C: FnMut(&mut Context<A>, &mut A, Vec<Asset>) + 'static>(
relative_paths: &[impl AsRef<str>],
callback: C,
) -> AssetRequest<A> {
AssetRequest {
assets: relative_paths
.into_iter()
.map(|path| Asset::new_err(path.as_ref().to_string(), LoaderError::Pending))
.collect::<Vec<Asset>>(),
callback: Box::new(callback),
}
}
pub(crate) fn call(mut self, ctx: &mut Context<A>, app: &mut A) {
(self.callback)(ctx, app, self.assets)
}
}