1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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);