1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use serde::{Deserialize, Serialize};

use crate::{
    asset::AssetType,
    cache::{current_package_cache_dir, current_package_identifier},
};

/// Clears all assets from the current package
pub fn clear_assets() -> std::io::Result<()> {
    let dir = current_package_cache_dir();
    if dir.exists() {
        std::fs::remove_dir_all(dir)?;
    }
    Ok(())
}

/// Adds an asset to the current package
pub fn add_asset(asset: AssetType) -> std::io::Result<AssetType> {
    let mut dir = current_package_cache_dir();
    dir.push("assets.toml");
    let mut package_assets: PackageAssets = if dir.exists() {
        let contents = std::fs::read_to_string(&dir)?;
        toml::from_str(&contents).unwrap_or_else(|_| PackageAssets {
            package: current_package_identifier(),
            assets: vec![],
        })
    } else {
        std::fs::create_dir_all(dir.parent().unwrap())?;
        PackageAssets {
            package: current_package_identifier(),
            assets: vec![],
        }
    };

    package_assets.add(asset.clone());
    let contents = toml::to_string(&package_assets).unwrap();
    std::fs::write(&dir, contents)?;

    Ok(asset)
}

/// All assets collected from a specific package
#[derive(Serialize, Deserialize, Debug, PartialEq, PartialOrd, Clone)]
pub struct PackageAssets {
    package: String,
    assets: Vec<AssetType>,
}

impl PackageAssets {
    /// Adds an asset to the package
    pub fn add(&mut self, asset: AssetType) {
        self.assets.push(asset);
    }

    /// Returns a reference to the package name
    pub fn package(&self) -> &str {
        &self.package
    }

    /// Returns a reference to the assets in this package
    pub fn assets(&self) -> &Vec<AssetType> {
        &self.assets
    }
}