use anyhow::anyhow;
use directories::ProjectDirs;
use nitro_shared::io::config::IO_CONFIG;
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct Paths {
pub config: PathBuf,
pub data: PathBuf,
pub internal: PathBuf,
pub assets: PathBuf,
pub libraries: PathBuf,
pub java: PathBuf,
pub jars: PathBuf,
pub auth: PathBuf,
pub logs: PathBuf,
pub launch_logs: PathBuf,
pub run: PathBuf,
pub stdio: PathBuf,
}
impl Paths {
pub fn new() -> anyhow::Result<Paths> {
let out = Self::new_no_create()?;
out.create_dirs()?;
Ok(out)
}
pub fn create_dirs(&self) -> anyhow::Result<()> {
let _ = std::fs::create_dir_all(&self.config);
let _ = std::fs::create_dir_all(&self.data);
let _ = std::fs::create_dir_all(&self.internal);
let _ = std::fs::create_dir_all(&self.assets);
let _ = std::fs::create_dir_all(&self.java);
let _ = std::fs::create_dir_all(&self.jars);
let _ = std::fs::create_dir_all(&self.auth);
let _ = std::fs::create_dir_all(&self.logs);
let _ = std::fs::create_dir_all(&self.launch_logs);
let _ = std::fs::create_dir_all(&self.run);
let _ = std::fs::create_dir_all(&self.stdio);
Ok(())
}
pub fn new_no_create() -> anyhow::Result<Self> {
let project = ProjectDirs::from("", "nitro", "nitro")
.ok_or(anyhow!("Failed to create project directories"))?;
let config = if let Some(dir) = IO_CONFIG.get_string("config_path") {
PathBuf::from(dir)
} else {
project.config_dir().to_owned()
};
let data = if let Some(dir) = IO_CONFIG.get_string("data_path") {
PathBuf::from(dir)
} else {
project.data_dir().to_owned()
};
let internal = data.join("internal");
let assets = internal.join("assets");
let libraries = internal.join("libraries");
let java = internal.join("java");
let jars = internal.join("jars");
let auth = internal.join("auth");
let logs = data.join("logs");
let launch_logs = logs.join("launch");
let run = project
.runtime_dir()
.map(|x| x.to_path_buf())
.unwrap_or(internal.join("run"));
let stdio = internal.join("stdio");
Ok(Paths {
config,
data,
internal,
assets,
libraries,
java,
jars,
auth,
logs,
launch_logs,
run,
stdio,
})
}
}