use std::{
fs,
path::{Path, PathBuf},
};
use keyvalues_parser::Vdf;
#[derive(Default, Clone, Debug)]
pub struct LibraryFolders {
pub paths: Vec<PathBuf>,
pub(crate) discovered: bool,
}
impl LibraryFolders {
pub(crate) fn discover(&mut self, path: &Path) {
let _ = self._discover(path);
}
fn _discover(&mut self, path: &Path) -> Option<()> {
let steamapps = path.join("steamapps");
self.paths.push(steamapps.clone());
let libraryfolders_vdf_path = steamapps.join("libraryfolders.vdf");
if libraryfolders_vdf_path.is_file() {
let vdf_text = fs::read_to_string(&libraryfolders_vdf_path).ok()?;
let value = Vdf::parse(&vdf_text).ok()?.value;
let obj = value.get_obj()?;
let library_folders: Vec<_> = obj
.iter()
.filter(|(key, values)| key.parse::<u32>().is_ok() && values.len() == 1)
.filter_map(|(_, values)| {
let library_folder_string = values
.get(0)?
.get_obj()?
.get("path")?
.get(0)?
.get_str()?
.to_string();
let library_folder = PathBuf::from(library_folder_string).join("steamapps");
Some(library_folder)
})
.collect();
self.paths = library_folders;
}
self.discovered = true;
Some(())
}
}