use std::path::PathBuf;
use crate::Result;
pub fn locate_steam_dir() -> Result<PathBuf> {
locate_steam_dir_helper()
}
#[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))]
fn locate_steam_dir_helper() -> Result<PathBuf> {
use crate::error::{Error, LocateError};
Err(Error::locate(LocateError::Unsupported))
}
#[cfg(target_os = "windows")]
fn locate_steam_dir_helper() -> Result<PathBuf> {
use crate::error::{Error, LocateError};
use winreg::{
enums::{HKEY_LOCAL_MACHINE, KEY_READ},
RegKey,
};
let io_to_locate_err = |io_err| Error::locate(LocateError::winreg(io_err));
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let installation_regkey = hklm
.open_subkey_with_flags("SOFTWARE\\Wow6432Node\\Valve\\Steam", KEY_READ)
.or_else(|_| {
hklm.open_subkey_with_flags("SOFTWARE\\Valve\\Steam", KEY_READ)
})
.map_err(io_to_locate_err)?;
let install_path_str: String = installation_regkey
.get_value("InstallPath")
.map_err(io_to_locate_err)?;
let install_path = PathBuf::from(install_path_str);
Ok(install_path)
}
#[cfg(target_os = "macos")]
fn locate_steam_dir_helper() -> Result<PathBuf> {
use crate::{error::LocateError, Error};
let home_dir = home::home_dir().ok_or_else(|| Error::locate(LocateError::no_home()))?;
let install_path = home_dir.join("Library/Application Support/Steam");
Ok(install_path)
}
#[cfg(target_os = "linux")]
fn locate_steam_dir_helper() -> Result<PathBuf> {
use std::env;
use crate::error::{Error, LocateError, ValidationError};
let home_dir = home::home_dir().ok_or_else(|| Error::locate(LocateError::no_home()))?;
let snap_dir = match env::var("SNAP_USER_DATA") {
Ok(snap_dir) => PathBuf::from(snap_dir),
Err(_) => home_dir.join("snap"),
};
let steam_paths = vec![
home_dir.join(".var/app/com.valvesoftware.Steam/.local/share/Steam"),
home_dir.join(".var/app/com.valvesoftware.Steam/.steam/steam"),
home_dir.join(".var/app/com.valvesoftware.Steam/.steam/root"),
home_dir.join(".local/share/Steam"),
home_dir.join(".steam/steam"),
home_dir.join(".steam/root"),
home_dir.join(".steam"),
snap_dir.join("steam/common/.local/share/Steam"),
snap_dir.join("steam/common/.steam/steam"),
snap_dir.join("steam/common/.steam/root"),
];
steam_paths
.into_iter()
.find(|x| x.is_dir())
.ok_or_else(|| Error::validation(ValidationError::missing_dir()))
}