cobble_core/instance/
shaderpacks.rs1use 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 #[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 #[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 #[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}