use std::path::{Path, PathBuf}; use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize, Debug, Clone)] pub struct Instance { pub name: String, pub path: Option // relative to launcher home (or absolute) } #[derive(Deserialize, Serialize, Debug, Clone)] pub struct Profile { pub version_id: String, pub java_runtime: Option, pub instance: String // ugly that this is a string instead of reference to an Instance but whatever I'm lazy } impl Instance { fn instance_dir(home: impl AsRef, name: impl AsRef) -> PathBuf { let mut out = home.as_ref().join("instances"); out.push(name); out } pub fn get_path(&self, home: impl AsRef) -> PathBuf { self.path.as_ref().map(|p| { if p.is_relative() { Self::instance_dir(home.as_ref(), p) } else { p.to_owned() } }).unwrap_or_else(|| Self::instance_dir(home, &self.name)) } }