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
use crate::error::CobbleResult;
use crate::instance::Instance;
use crate::minecraft::models::asset_index_data::AssetIndexData;
use crate::utils::download::download_file_check;
use std::fs;

impl Instance {
    /// Saves the asset index JSON to disk.
    pub fn save_asset_index(&self) -> CobbleResult<()> {
        let version_data = self.read_version_data()?;

        if let Some(asset_index) = &version_data.asset_index {
            let mut indexes_path = self.asset_index_path();

            // Create folder
            fs::create_dir_all(&indexes_path)?;

            // Download file
            indexes_path.push(format!("{}.json", &version_data.assets));
            let sha = hex::decode(&asset_index.sha1)?;
            download_file_check(&asset_index.url, indexes_path, Some(sha))?;
        }

        Ok(())
    }

    /// Read the asset index JSON from disk.
    /// This does not download the index if it does not exist.
    pub fn read_asset_index(&self) -> CobbleResult<AssetIndexData> {
        let version_data = self.read_version_data()?;

        let mut asset_index_path = self.asset_index_path();
        asset_index_path.push(format!("{}.json", &version_data.assets));

        let asset_index_file = fs::File::open(asset_index_path)?;
        let asset_index = serde_json::from_reader::<_, AssetIndexData>(asset_index_file)?;

        Ok(asset_index)
    }
}