Skip to main content

17_smart_references/
17_smart_references.rs

1use 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    /* ANCHOR: main */
10    let mut database = AssetDatabase::default()
11        .with_protocol(TextAssetProtocol)
12        .with_fetch(FileAssetFetch::default().with_root("resources"));
13
14    /* ANCHOR: smart_reference */
15    // Load asset and mark its first reference.
16    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    // Clone the asset and mark its second reference.
32    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    // Ensure asset again from scratch and mark its third reference.
44    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 the first reference and expect 2 references.
56    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 the second reference and expect 1 reference.
68    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 the third reference and expect no references and asset no more existing.
80    drop(third);
81    database.maintain()?;
82    assert_eq!(database.storage.len(), 0);
83    /* ANCHOR_END: smart_reference */
84    /* ANCHOR_END: main */
85
86    Ok(())
87}