hassium_core/assets/protocols/
set.rs

1use crate::assets::{
2    asset::{Asset, AssetID},
3    protocol::{AssetLoadResult, AssetProtocol, AssetVariant, Meta},
4};
5use std::str::from_utf8;
6
7pub struct SetAsset {
8    paths: Vec<String>,
9    ids: Vec<AssetID>,
10}
11
12impl SetAsset {
13    pub fn paths(&self) -> &[String] {
14        &self.paths
15    }
16
17    pub fn ids(&self) -> &[AssetID] {
18        &self.ids
19    }
20}
21
22pub struct SetAssetProtocol;
23
24impl AssetProtocol for SetAssetProtocol {
25    fn name(&self) -> &str {
26        "set"
27    }
28
29    fn on_load(&mut self, data: Vec<u8>) -> AssetLoadResult {
30        let data = from_utf8(&data).unwrap().to_owned();
31        let list = data
32            .split(|c| c == '\n' || c == '\r')
33            .enumerate()
34            .filter_map(|(i, line)| {
35                let path = line.trim();
36                if path.is_empty() || path.starts_with('#') {
37                    None
38                } else {
39                    Some((i.to_string(), path.to_owned()))
40                }
41            })
42            .collect::<Vec<_>>();
43        AssetLoadResult::Yield(None, list)
44    }
45
46    fn on_resume(&mut self, _: Meta, list: &[(&str, &Asset)]) -> AssetLoadResult {
47        let paths = list
48            .iter()
49            .map(|(_, asset)| asset.to_full_path())
50            .collect::<Vec<_>>();
51        let ids = list.iter().map(|(_, asset)| asset.id()).collect::<Vec<_>>();
52        AssetLoadResult::Data(Box::new(SetAsset { paths, ids }))
53    }
54
55    fn on_unload(&mut self, asset: &Asset) -> Option<Vec<AssetVariant>> {
56        if let Some(asset) = asset.get::<SetAsset>() {
57            Some(asset.ids().iter().map(|id| AssetVariant::Id(*id)).collect())
58        } else {
59            None
60        }
61    }
62}