1use chunk_reader::{ChunkReader, ResourceId};
6use limnus_app::prelude::{App, Plugin};
7use limnus_assets::prelude::{AssetName, RawWeakId};
8use limnus_resource::prelude::Resource;
9use message_channel::{Channel, Receiver, Sender};
10use std::fmt::Debug;
11use tracing::debug;
12
13pub struct Blob {
14 pub path: AssetName,
15 pub content: Vec<u8>,
16 pub id: RawWeakId,
17}
18
19impl Debug for Blob {
20 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21 write!(f, "{{ name:{} size:{} }}", self.path, self.content.len())
22 }
23}
24
25pub async fn load(
26 reader: Box<dyn ChunkReader>,
27 sender: &Sender<Blob>,
28 asset_name: AssetName,
29 id: RawWeakId,
30) {
31 if let Ok(octets) = reader
32 .fetch_octets(ResourceId::from(asset_name.value()))
33 .await
34 {
35 let blob = Blob {
36 path: asset_name,
37 content: octets,
38 id,
39 };
40 sender.send(blob).expect("could not send blob to channel");
41 }
42}
43
44#[derive(Debug, Resource)]
45pub struct LoaderReceiver {
46 pub receiver: Receiver<Blob>,
47}
48
49#[derive(Debug, Resource)]
50pub struct LoaderSender {
51 pub sender: Sender<Blob>,
52}
53
54pub struct LoaderPlugin;
55
56impl Plugin for LoaderPlugin {
57 fn build(&self, app: &mut App) {
58 debug!("creating a blob channel");
59 let (sender, receiver) = Channel::<Blob>::create();
60 app.insert_resource(LoaderReceiver { receiver });
61 app.insert_resource(LoaderSender { sender });
62 }
63}