cobble_core/instance/
shaderpacks.rs

1use crate::error::CobbleResult;
2use crate::minecraft::{load_shaderpacks, parse_shaderpack, Shaderpack};
3use crate::Instance;
4use std::path::{Path, PathBuf};
5use tokio::fs::create_dir_all;
6
7impl Instance {
8    /// Path to the .minecraft/resourcepacks or .minecraft/texturepacks folder.
9    #[cfg_attr(doc_cfg, doc(cfg(feature = "shaderpacks")))]
10    pub fn shaderpacks_path(&self) -> PathBuf {
11        let mut shaderpacks_path = self.dot_minecraft_path();
12
13        shaderpacks_path.push("shaderpacks");
14
15        shaderpacks_path
16    }
17
18    /// Loads all shaderpacks from this instance.
19    #[cfg_attr(doc_cfg, doc(cfg(feature = "shaderpacks")))]
20    pub async fn load_shaderpacks(&self) -> CobbleResult<Vec<Shaderpack>> {
21        load_shaderpacks(self.dot_minecraft_path()).await
22    }
23
24    /// Adds a shaderpack.
25    ///
26    /// Returns `None` when `src` is not a valid shaderpack.
27    #[instrument(name = "add_shaderpack", level = "trace", skip_all, fields(src))]
28    #[cfg_attr(doc_cfg, doc(cfg(feature = "shaderpacks")))]
29    pub async fn add_shaderpack(&self, src: impl AsRef<Path>) -> CobbleResult<Option<Shaderpack>> {
30        trace!("Validating src...");
31        if parse_shaderpack(PathBuf::from(src.as_ref()))
32            .await?
33            .is_none()
34        {
35            return Ok(None);
36        }
37
38        trace!("Building new path for shaderpack");
39        let file_name = src
40            .as_ref()
41            .file_name()
42            .ok_or_else(|| std::io::Error::new(std::io::ErrorKind::Other, "Path ends with '..'"))?;
43        let mut shaderpack_path = self.shaderpacks_path();
44        shaderpack_path.push(file_name);
45        tracing::Span::current().record("dest", shaderpack_path.to_string_lossy().to_string());
46
47        if let Some(parent) = shaderpack_path.parent() {
48            trace!("Creating shaderpacks folder...");
49            create_dir_all(parent).await?;
50        }
51
52        trace!("Copying shaderpack...");
53        tokio::fs::copy(src, &shaderpack_path).await?;
54
55        trace!("Parsing new shaderpack...");
56        let shaderpack = parse_shaderpack(shaderpack_path).await?;
57        Ok(shaderpack)
58    }
59}