Skip to main content

14_assets_versioning/
14_assets_versioning.rs

1use keket::{
2    database::{AssetDatabase, path::AssetPath},
3    fetch::{file::FileAssetFetch, rewrite::RewriteAssetFetch},
4    protocol::text::TextAssetProtocol,
5};
6use std::error::Error;
7
8// Current assets version.
9const VERSION: &str = "2";
10
11fn main() -> Result<(), Box<dyn Error>> {
12    let mut database = AssetDatabase::default()
13        .with_protocol(TextAssetProtocol)
14        // Rewrite asset fetch allows to rewrite input asset paths to some other
15        // before inner fetch tries to load it.
16        .with_fetch(RewriteAssetFetch::new(
17            FileAssetFetch::default().with_root("resources"),
18            |path| {
19                // Get version from requested asset meta items or use current version.
20                let version = path
21                    .meta_items()
22                    .find(|(key, _)| *key == "v")
23                    .map(|(_, value)| value)
24                    .unwrap_or(VERSION);
25                // Build new asset path that includes version.
26                // Example: `protocol://dir/asset.v1.ext`
27                Ok(AssetPath::from_parts(
28                    path.protocol(),
29                    &format!(
30                        "{}.v{}{}",
31                        path.path_without_extension(),
32                        version,
33                        path.path_dot_extension().unwrap_or_default()
34                    ),
35                    path.meta(),
36                ))
37            },
38        ));
39
40    // Gets `text://versioned.v1.txt`.
41    let v1 = database.ensure("text://versioned.txt?v=1")?;
42    println!("Version 1: {}", v1.access::<&String>(&database));
43
44    // Gets `text://versioned.v2.txt`.
45    let v2 = database.ensure("text://versioned.txt")?;
46    println!("Version 2: {}", v2.access::<&String>(&database));
47
48    Ok(())
49}