nitro_core/io/files/
paths.rs1use anyhow::anyhow;
2use directories::ProjectDirs;
3
4use std::path::PathBuf;
5
6use crate::io::config::IO_CONFIG;
7
8#[derive(Debug, Clone)]
10pub struct Paths {
11 pub config: PathBuf,
13 pub data: PathBuf,
15 pub internal: PathBuf,
17 pub assets: PathBuf,
19 pub libraries: PathBuf,
21 pub java: PathBuf,
23 pub jars: PathBuf,
25 pub auth: PathBuf,
27 pub logs: PathBuf,
29 pub launch_logs: PathBuf,
31 pub run: PathBuf,
33 pub stdio: PathBuf,
35}
36
37impl Paths {
38 pub fn new() -> anyhow::Result<Paths> {
41 let out = Self::new_no_create()?;
42 out.create_dirs()?;
43
44 Ok(out)
45 }
46
47 pub fn create_dirs(&self) -> anyhow::Result<()> {
49 let _ = std::fs::create_dir_all(&self.config);
50 let _ = std::fs::create_dir_all(&self.data);
51 let _ = std::fs::create_dir_all(&self.internal);
52 let _ = std::fs::create_dir_all(&self.assets);
53 let _ = std::fs::create_dir_all(&self.java);
54 let _ = std::fs::create_dir_all(&self.jars);
55 let _ = std::fs::create_dir_all(&self.auth);
56 let _ = std::fs::create_dir_all(&self.logs);
57 let _ = std::fs::create_dir_all(&self.launch_logs);
58 let _ = std::fs::create_dir_all(&self.run);
59 let _ = std::fs::create_dir_all(&self.stdio);
60
61 Ok(())
62 }
63
64 pub fn new_no_create() -> anyhow::Result<Self> {
66 let project = ProjectDirs::from("", "nitro", "nitro")
67 .ok_or(anyhow!("Failed to create project directories"))?;
68
69 let config = if let Some(dir) = IO_CONFIG.get("config_path") {
70 PathBuf::from(dir)
71 } else {
72 project.config_dir().to_owned()
73 };
74 let data = if let Some(dir) = IO_CONFIG.get("data_path") {
75 PathBuf::from(dir)
76 } else {
77 project.data_dir().to_owned()
78 };
79
80 let internal = data.join("internal");
81 let assets = internal.join("assets");
82 let libraries = internal.join("libraries");
83 let java = internal.join("java");
84 let jars = internal.join("jars");
85 let auth = internal.join("auth");
86 let logs = data.join("logs");
87 let launch_logs = logs.join("launch");
88 let run = project
89 .runtime_dir()
90 .map(|x| x.to_path_buf())
91 .unwrap_or(internal.join("run"));
92 let stdio = internal.join("stdio");
93
94 Ok(Paths {
95 config,
96 data,
97 internal,
98 assets,
99 libraries,
100 java,
101 jars,
102 auth,
103 logs,
104 launch_logs,
105 run,
106 stdio,
107 })
108 }
109}