#[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))]
compile_error!("Unsupported operating system!");
use std::{collections::HashMap, path::PathBuf};
#[cfg(target_os = "windows")]
use winreg::{
enums::{HKEY_LOCAL_MACHINE, KEY_READ},
RegKey,
};
#[cfg(not(target_os = "windows"))]
extern crate dirs;
#[doc(hidden)]
pub mod steamapp;
pub use steamapp::SteamApp;
#[doc(hidden)]
pub mod libraryfolders;
pub use libraryfolders::LibraryFolders;
mod steamapps;
use steamapps::SteamApps;
mod shortcut;
pub use shortcut::Shortcut;
#[derive(Default, Clone, Debug)]
pub struct SteamDir {
pub path: PathBuf,
pub(crate) steam_apps: SteamApps,
pub(crate) libraryfolders: LibraryFolders,
pub(crate) shortcuts: Option<Vec<Shortcut>>,
}
impl SteamDir {
pub fn libraryfolders(&mut self) -> &LibraryFolders {
let libraryfolders = &mut self.libraryfolders;
if !libraryfolders.discovered {
libraryfolders.discover(&self.path);
}
&*libraryfolders
}
pub fn apps(&mut self) -> &HashMap<u32, Option<SteamApp>> {
let steam_apps = &mut self.steam_apps;
if !steam_apps.discovered {
let libraryfolders = &mut self.libraryfolders;
if !libraryfolders.discovered {
libraryfolders.discover(&self.path);
}
steam_apps.discover_apps(libraryfolders);
}
&steam_apps.apps
}
pub fn app(&mut self, app_id: &u32) -> Option<&SteamApp> {
let steam_apps = &mut self.steam_apps;
if !steam_apps.apps.contains_key(app_id) {
let libraryfolders = &mut self.libraryfolders;
if !libraryfolders.discovered {
libraryfolders.discover(&self.path);
}
if let None = steam_apps.discover_app(libraryfolders, app_id) {
steam_apps.apps.insert(*app_id, None);
}
}
steam_apps.apps.get(app_id).unwrap().as_ref()
}
pub fn shortcuts(&mut self) -> &[Shortcut] {
if self.shortcuts.is_none() {
let shortcuts = shortcut::discover_shortcuts(&self.path);
self.shortcuts = Some(shortcuts);
}
self.shortcuts.as_ref().unwrap()
}
#[cfg(target_os = "windows")]
pub fn locate() -> Option<SteamDir> {
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let installation_regkey = match
hklm.open_subkey_with_flags("SOFTWARE\\Wow6432Node\\Valve\\Steam", KEY_READ).or_else(|_| hklm.open_subkey_with_flags("SOFTWARE\\Valve\\Steam", KEY_READ)) {
Ok(installation_regkey) => installation_regkey,
Err(_) => return None
};
let install_path_str: String = match installation_regkey.get_value("InstallPath") {
Ok(install_path_str) => install_path_str,
Err(_) => return None,
};
let install_path = PathBuf::from(install_path_str);
Some(SteamDir {
path: install_path,
..Default::default()
})
}
#[cfg(target_os = "macos")]
pub fn locate() -> Option<SteamDir> {
let home_dir = match dirs::home_dir() {
Some(home_dir) => home_dir,
None => return None,
};
let install_path = home_dir.join("Library/Application Support/Steam");
return match install_path.is_dir() {
false => None,
true => Some(SteamDir {
path: install_path,
..Default::default()
}),
};
}
#[cfg(target_os = "linux")]
pub fn locate() -> Option<SteamDir> {
let home_dir = match dirs::home_dir() {
Some(home_dir) => home_dir,
None => return None,
};
let steam_flatpak_path = home_dir.join(".var/app/com.valvesoftware.Steam");
if steam_flatpak_path.is_dir() {
let steam_flatpak_install_path = steam_flatpak_path.join(".steam/steam");
if steam_flatpak_install_path.is_dir() {
return Some(SteamDir {
path: steam_flatpak_install_path,
..Default::default()
});
}
}
let standard_path = home_dir.join(".steam/steam");
if standard_path.is_dir() {
return Some(SteamDir {
path: standard_path,
..Default::default()
});
}
None
}
}
#[cfg(test)]
mod tests;