diff --git a/src/paths.rs b/src/paths.rs index 7fce365..c574842 100644 --- a/src/paths.rs +++ b/src/paths.rs @@ -95,8 +95,8 @@ const STEAMVR_STEAM_APPID: u32 = 250820; fn get_steamvr_base_dir() -> anyhow::Result { SteamLibraryFolder::get_folders()? .into_iter() - .find(|(_, lf)| lf.apps.contains_key(&STEAMVR_STEAM_APPID)) - .map(|(_, lf)| PathBuf::from(lf.path).join("steamapps/common/SteamVR")) + .find(|lf| lf.apps.contains_key(&STEAMVR_STEAM_APPID)) + .map(|lf| PathBuf::from(lf.path).join("steamapps/common/SteamVR")) .ok_or(anyhow::Error::msg( "Could not find SteamVR in Steam libraryfolders.vdf", )) diff --git a/src/steam_linux_runtime_injector.rs b/src/steam_linux_runtime_injector.rs index 6e08b5f..b517abc 100644 --- a/src/steam_linux_runtime_injector.rs +++ b/src/steam_linux_runtime_injector.rs @@ -22,8 +22,8 @@ fn get_sniper_runtime_entrypoint_path() -> Option { match SteamLibraryFolder::get_folders() { Ok(libraryfolders) => libraryfolders .iter() - .find(|(_, folder)| folder.apps.contains_key(&SNIPER_RUNTIME_STEAM_APPID)) - .map(|(_, folder)| { + .find(|folder| folder.apps.contains_key(&SNIPER_RUNTIME_STEAM_APPID)) + .map(|folder| { PathBuf::from(&folder.path) .join("steamapps/common/SteamLinuxRuntime_sniper/_v2-entry-point") }), @@ -38,8 +38,8 @@ fn get_soldier_runtime_entrypoint_path() -> Option { match SteamLibraryFolder::get_folders() { Ok(libraryfolders) => libraryfolders .iter() - .find(|(_, folder)| folder.apps.contains_key(&SOLDIER_RUNTIME_STEAM_APPID)) - .map(|(_, folder)| { + .find(|folder| folder.apps.contains_key(&SOLDIER_RUNTIME_STEAM_APPID)) + .map(|folder| { PathBuf::from(&folder.path) .join("steamapps/common/SteamLinuxRuntime_soldier/_v2-entry-point") }), diff --git a/src/util/steam_library_folder.rs b/src/util/steam_library_folder.rs index 17616ba..401ea57 100644 --- a/src/util/steam_library_folder.rs +++ b/src/util/steam_library_folder.rs @@ -3,7 +3,7 @@ use anyhow::bail; use serde::Deserialize; use std::{ collections::HashMap, - fs::read_to_string, + fs::{self, read_to_string}, path::{Path, PathBuf}, }; @@ -30,13 +30,16 @@ pub fn chaperone_info_exists() -> bool { } impl SteamLibraryFolder { - pub fn get_folders() -> anyhow::Result> { + pub fn get_folders() -> anyhow::Result> { if let Some(libraryfolders_path) = get_all_potential_steam_main_dir_paths() .into_iter() .filter_map(|p| p.join("steamapps/libraryfolders.vdf").canonicalize().ok()) .find(|p| p.is_file()) { - Self::get_folders_from_path(&libraryfolders_path) + Ok(Self::get_folders_from_path(&libraryfolders_path)? + .into_iter() + .filter(|f| matches!(fs::exists(f.path.clone()), Ok(true))) + .collect()) } else { bail!("Steam libraryfolders.vdf does not exist in any of its canonical locations"); } @@ -45,8 +48,12 @@ impl SteamLibraryFolder { /// Do not use this: use get_folders() instead as it always uses Steam's /// canonical root path. This is intended to be directly used only for /// unit tests - pub fn get_folders_from_path(p: &Path) -> anyhow::Result> { - Ok(keyvalues_serde::from_str(read_to_string(p)?.as_str())?) + pub fn get_folders_from_path(p: &Path) -> anyhow::Result> { + Ok( + keyvalues_serde::from_str::>(read_to_string(p)?.as_str())? + .into_values() + .collect(), + ) } } @@ -62,7 +69,7 @@ mod tests { )) .unwrap(); assert_eq!(lf.len(), 1); - let first = lf.get(&0).unwrap(); + let first = lf.first().unwrap(); assert_eq!(first.path, "/home/gabmus/.local/share/Steam"); assert_eq!(first.apps.len(), 10); assert_eq!(first.apps.get(&228980).unwrap(), &29212173);