Skip to main content

extendable_assets/
lib.rs

1//! # Extendable Assets
2//!
3//! An asset framework for graphics and games that provides flexible asset management,
4//! loading, and saving capabilities.
5//!
6//! ## Example
7//!
8//! ```rust
9//! use std::sync::Arc;
10//! use extendable_assets::*;
11//!
12//! // Define your asset data type
13//! #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)]
14//! pub struct TextureData {
15//!     pub width: u32,
16//!     pub height: u32,
17//!     pub format: String,
18//!     pub pixels: Vec<u8>,
19//! }
20//!
21//! // Implement the AssetData trait
22//! impl AssetData for TextureData {}
23//!
24//! // Create an asset type that defines how to load/save your assets
25//! pub struct TextureAssetType;
26//!
27//! impl AssetType for TextureAssetType {
28//!     fn name(&self) -> &str {
29//!         "Texture"
30//!     }
31//!     
32//!     fn loader(&self) -> Box<dyn AssetDataLoader> {
33//!         struct TextureLoader;
34//!         impl AssetDataLoader for TextureLoader {
35//!             fn asset_from_bytes(
36//!                 &self,
37//!                 bytes: &[u8],
38//!                 _context: Option<Arc<dyn AssetManagerContext>>,
39//!             ) -> Result<Box<dyn AssetData>, AssetLoadError> {
40//!                 let data: TextureData = serde_json::from_slice(bytes)
41//!                     .map_err(|e| AssetLoadError::Deserialization(anyhow::Error::new(e)))?;
42//!                 Ok(Box::new(data))
43//!             }
44//!         }
45//!         Box::new(TextureLoader)
46//!     }
47//!     
48//!     fn saver(&self) -> Box<dyn AssetDataSaver> {
49//!         struct TextureSaver;
50//!         impl AssetDataSaver for TextureSaver {
51//!             fn asset_to_bytes(
52//!                 &self,
53//!                 asset: &dyn AssetData,
54//!                 _context: Option<Arc<dyn AssetManagerContext>>,
55//!             ) -> Result<Vec<u8>, AssetSaveError> {
56//!                 let data = asset
57//!                     .downcast_ref::<TextureData>()
58//!                     .ok_or(AssetSaveError::UnsupportedType)?;
59//!                 serde_json::to_vec(&data)
60//!                     .map_err(|e| AssetSaveError::Serialization(anyhow::Error::new(e)))
61//!             }
62//!         }
63//!         Box::new(TextureSaver)
64//!     }
65//! }
66//!
67//! # tokio_test::block_on(async {
68//! // Create asset manager with native filesystem
69//! let mut manager = AssetManager::new(Arc::new(NativeFilesystem::new("assets")));
70//! 
71//! // Set JSON serialization backend
72//! manager.set_serialization_backend(Box::new(JsonAssetSerializationBackend));
73//! 
74//! // Register your asset type
75//! manager.register_asset_type(Arc::new(TextureAssetType));
76//! 
77//! // Create and register an asset manually
78//! let texture_data = TextureData {
79//!     width: 256,
80//!     height: 256,
81//!     format: "RGBA8".to_string(),
82//!     pixels: vec![255; 256 * 256 * 4],
83//! };
84//! 
85//! let asset_type = manager.asset_type_by_name("Texture").unwrap();
86//! let asset = Asset::new(asset_type, Box::new(texture_data));
87//! let asset_id = manager.register_asset("my_texture", asset);
88//!
89//! // Get the asset back
90//! let retrieved_asset = manager.asset_by_id(asset_id).unwrap();
91//! if let Some(texture) = retrieved_asset.data().downcast_ref::<TextureData>() {
92//!     assert_eq!(texture.width, 256);
93//!     assert_eq!(texture.height, 256);
94//! }
95//! # });
96//! ```
97
98mod asset;
99mod asset_type;
100mod filesystem;
101mod loader;
102mod manager;
103mod saver;
104mod util;
105
106/// Third-party re-exports for external crates used by this library.
107pub mod third_party;
108
109pub use asset::*;
110pub use asset_type::*;
111pub use filesystem::*;
112pub use loader::*;
113pub use manager::*;
114pub use saver::*;