use anyhow::anyhow;
use directories::{BaseDirs, ProjectDirs};
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct Paths {
pub base: BaseDirs,
pub project: ProjectDirs,
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,
}
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.data);
let _ = std::fs::create_dir_all(self.project.cache_dir());
let _ = std::fs::create_dir_all(self.project.config_dir());
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);
Ok(())
}
pub fn new_no_create() -> anyhow::Result<Self> {
let base = BaseDirs::new().ok_or(anyhow!("Failed to create base directories"))?;
let project = ProjectDirs::from("", "mcvm", "mcvm")
.ok_or(anyhow!("Failed to create project directories"))?;
let data = 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"));
Ok(Paths {
base,
project,
data,
internal,
assets,
libraries,
java,
jars,
auth,
logs,
launch_logs,
run,
})
}
}