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}