nitro_core/io/files/
paths.rs

1use anyhow::anyhow;
2use directories::ProjectDirs;
3
4use std::path::PathBuf;
5
6use crate::io::config::IO_CONFIG;
7
8/// Store for all of the paths that are used throughout the application
9#[derive(Debug, Clone)]
10pub struct Paths {
11	/// Config directory
12	pub config: PathBuf,
13	/// Holds data
14	pub data: PathBuf,
15	/// Holds internal data
16	pub internal: PathBuf,
17	/// Holds game assets
18	pub assets: PathBuf,
19	/// Holds game libraries
20	pub libraries: PathBuf,
21	/// Holds Java installations
22	pub java: PathBuf,
23	/// Holds game jar files
24	pub jars: PathBuf,
25	/// Holds authentication data
26	pub auth: PathBuf,
27	/// Holds log files
28	pub logs: PathBuf,
29	/// Holds launch log files
30	pub launch_logs: PathBuf,
31	/// Used for runtime info like PIDs
32	pub run: PathBuf,
33	/// Used for temporary stdio files for instances
34	pub stdio: PathBuf,
35}
36
37impl Paths {
38	/// Create a new Paths object. This will create all of the directories
39	/// referenced in the paths if they do not already exist.
40	pub fn new() -> anyhow::Result<Paths> {
41		let out = Self::new_no_create()?;
42		out.create_dirs()?;
43
44		Ok(out)
45	}
46
47	/// Create the directories on an existing set of paths
48	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	/// Create the paths without creating any directories
65	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}