use std::{
error::Error,
str::FromStr,
};
pub trait Loader<T> {
fn load(content: Vec<u8>) -> Result<T, Box<dyn Error + Send + Sync>>;
}
#[derive(Debug)]
pub struct CustomLoader;
impl<T> Loader<T> for CustomLoader {
fn load(_: Vec<u8>) -> Result<T, Box<dyn Error + Send + Sync>> {
panic!("You forgot to override `Asset::load_from_raw` function")
}
}
#[derive(Debug)]
#[deprecated = "This Loader cannot be used to implement the Asset trait and will be removed in a future release"]
pub struct StringLoader;
#[allow(deprecated)]
impl Loader<String> for StringLoader {
fn load(content: Vec<u8>) -> Result<String, Box<dyn Error + Send + Sync>> {
Ok(String::from_utf8(content)?)
}
}
#[derive(Debug)]
pub struct ParseLoader;
impl<T> Loader<T> for ParseLoader
where
T: FromStr,
<T as FromStr>::Err: Error + Send + Sync + 'static,
{
fn load(content: Vec<u8>) -> Result<T, Box<dyn Error + Send + Sync>> {
let string = String::from_utf8(content)?;
Ok(string.parse()?)
}
}
macro_rules! serde_loader {
($feature:literal, $doc:literal, $name:ident, $fun:path) => {
#[doc = $doc]
#[cfg(feature = $feature)]
#[cfg_attr(docsrs, doc(cfg(feature = $feature)))]
#[derive(Debug)]
pub struct $name;
#[cfg(feature = $feature)]
impl<T> Loader<T> for $name
where
T: for<'de> serde::Deserialize<'de>,
{
#[inline]
fn load(content: Vec<u8>) -> Result<T, Box<dyn Error + Send + Sync>> {
Ok($fun(&*content)?)
}
}
}
}
serde_loader!("bincode", "Loads assets from Bincode encoded files.", BincodeLoader, serde_bincode::deserialize);
serde_loader!("cbor", "Loads assets from CBOR encoded files.", CborLoader, serde_cbor::from_slice);
serde_loader!("json", "Loads assets from JSON files.", JsonLoader, serde_json::from_slice);
serde_loader!("msgpack", "Loads assets from MessagePack files.", MessagePackLoader, serde_msgpack::decode::from_read);
serde_loader!("ron", "Loads assets from RON files.", RonLoader, serde_ron::de::from_bytes);
serde_loader!("toml", "Loads assets from TOML files.", TomlLoader, serde_toml::de::from_slice);
serde_loader!("yaml", "Loads assets from YAML files.", YamlLoader, serde_yaml::from_slice);