Skip to main content

conduit_cli/
paths.rs

1use dirs::data_local_dir;
2use std::fs;
3use std::path::{Path, PathBuf};
4
5use crate::core::domain::loader::Loader;
6
7#[derive(Clone, Debug)]
8pub struct ConduitPaths {
9    pub root: PathBuf,
10    pub store: PathBuf,
11}
12
13impl ConduitPaths {
14    pub fn new<P: AsRef<Path>>(project_root: P) -> Self {
15        let root = project_root.as_ref().to_path_buf();
16        let store =
17            data_local_dir().map_or_else(|| root.join(".conduit_data"), |p| p.join("conduit"));
18
19        Self { root, store }
20    }
21
22    pub fn manifest_name() -> &'static str {
23        "conduit.toml"
24    }
25
26    pub fn lockfile_name() -> &'static str {
27        "conduit.lock"
28    }
29
30    pub fn include_name() -> &'static str {
31        ".conduitinclude"
32    }
33
34    pub fn manifest(&self) -> PathBuf {
35        self.root.join(Self::manifest_name())
36    }
37
38    pub fn lock(&self) -> PathBuf {
39        self.root.join(Self::lockfile_name())
40    }
41
42    pub fn include(&self) -> PathBuf {
43        self.root.join(Self::include_name())
44    }
45
46    pub fn runtimes_dir(&self) -> PathBuf {
47        self.store.join("runtimes")
48    }
49
50    pub fn objects_dir(&self) -> PathBuf {
51        self.store.join("objects")
52    }
53
54    pub fn ensure_dirs(&self) -> std::io::Result<()> {
55        fs::create_dir_all(self.objects_dir())?;
56        fs::create_dir_all(self.runtimes_dir())?;
57        Ok(())
58    }
59
60    pub fn get_runtime_id(loader: &Loader, mc_version: &str) -> String {
61        let name = match loader {
62            Loader::Vanilla => "vanilla".to_string(),
63            Loader::Fabric => "fabric".to_string(),
64            Loader::Paper => "paper".to_string(),
65            Loader::Purpur => "purpur".to_string(),
66            Loader::Neoforge { version } => format!("neoforge-{version}"),
67            Loader::Forge { version } => format!("forge-{version}"),
68        };
69        format!("{name}@{mc_version}")
70    }
71
72    pub fn is_conduit_file(name: &str) -> bool {
73        matches!(
74            name,
75            "conduit.toml"
76                | "conduit.lock"
77                | ".conduit_runtimes"
78                | ".git"
79                | ".conduit"
80                | "eula.txt"
81        )
82    }
83}