limnus_loader/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/limnus
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use 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}