use bevy::asset::LoadContext;
use std::{
io::{Cursor, Error as IoError, ErrorKind, Read},
path::Path,
sync::Arc,
};
pub(crate) struct BytesResourceReader<'a, 'b> {
bytes: Arc<[u8]>,
context: &'a mut LoadContext<'b>,
}
impl<'a, 'b> BytesResourceReader<'a, 'b> {
pub(crate) fn new(bytes: &'a [u8], context: &'a mut LoadContext<'b>) -> Self {
Self {
bytes: Arc::from(bytes),
context,
}
}
}
impl<'a> tiled::ResourceReader for BytesResourceReader<'a, '_> {
type Resource = Box<dyn Read + 'a>;
type Error = IoError;
fn read_from(&mut self, path: &Path) -> std::result::Result<Self::Resource, Self::Error> {
if let Some(extension) = path.extension() {
if extension == "tsx" {
let future = self.context.read_asset_bytes(path.to_path_buf());
let data = futures_lite::future::block_on(future)
.map_err(|err| IoError::new(ErrorKind::NotFound, err))?;
return Ok(Box::new(Cursor::new(data)));
}
}
Ok(Box::new(Cursor::new(self.bytes.clone())))
}
}