17_smart_references/
17_smart_references.rs1use keket::{
2 database::{AssetDatabase, AssetReferenceCounter, reference::SmartAssetRef},
3 fetch::file::FileAssetFetch,
4 protocol::text::TextAssetProtocol,
5};
6use std::error::Error;
7
8fn main() -> Result<(), Box<dyn Error>> {
9 let mut database = AssetDatabase::default()
11 .with_protocol(TextAssetProtocol)
12 .with_fetch(FileAssetFetch::default().with_root("resources"));
13
14 let first = SmartAssetRef::new("text://lorem.txt", &mut database)?;
17 println!(
18 "Lorem Ipsum: {}",
19 first.resolve(&database)?.access::<&String>()
20 );
21 database.maintain()?;
22 assert_eq!(database.storage.len(), 1);
23 assert_eq!(
24 first
25 .resolve(&database)?
26 .access::<&AssetReferenceCounter>()
27 .counter(),
28 1
29 );
30
31 let second = first.clone();
33 database.maintain()?;
34 assert_eq!(database.storage.len(), 1);
35 assert_eq!(
36 second
37 .resolve(&database)?
38 .access::<&AssetReferenceCounter>()
39 .counter(),
40 2
41 );
42
43 let third = SmartAssetRef::new("text://lorem.txt", &mut database)?;
45 database.maintain()?;
46 assert_eq!(database.storage.len(), 1);
47 assert_eq!(
48 third
49 .resolve(&database)?
50 .access::<&AssetReferenceCounter>()
51 .counter(),
52 3
53 );
54
55 drop(first);
57 database.maintain()?;
58 assert_eq!(database.storage.len(), 1);
59 assert_eq!(
60 third
61 .resolve(&database)?
62 .access::<&AssetReferenceCounter>()
63 .counter(),
64 2
65 );
66
67 drop(second);
69 database.maintain()?;
70 assert_eq!(database.storage.len(), 1);
71 assert_eq!(
72 third
73 .resolve(&database)?
74 .access::<&AssetReferenceCounter>()
75 .counter(),
76 1
77 );
78
79 drop(third);
81 database.maintain()?;
82 assert_eq!(database.storage.len(), 0);
83 Ok(())
87}