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::*;