steamlocate 0.1.3

Rust Crate for locating Steam game installation directories (and Steam itself!)
Documentation
use regex::Regex;
use crate::steamapp::SteamApp;
use crate::libraryfolders::LibraryFolders;
use std::collections::HashMap;

lazy_static! {
	static ref APPMANIFEST_RE: Regex = Regex::new(r"^appmanifest_(\d+)\.acf$").unwrap();
}

#[derive(Default, Clone, Debug)]
pub(crate) struct SteamApps {
	pub(crate) apps: HashMap<u32, Option<SteamApp>>,
	pub(crate) discovered: bool
}

impl SteamApps {
	pub(crate) fn discover_apps(&mut self, libraryfolders: &LibraryFolders) {
		self.apps.drain();
		
		for libraryfolder in &libraryfolders.paths {
			let read_dir = libraryfolder.read_dir();
			if read_dir.is_err() { continue }
			for result in read_dir.unwrap() {
				let file = match result {
					Err(_) => continue,
					Ok(file) => file
				};

				let mut path = file.path();
				if !path.is_file() { continue }

				let app_id = match APPMANIFEST_RE.captures(&file.file_name().to_string_lossy()) {
					None => continue,
					Some(captures) => match captures.get(1) {
						None => continue,
						Some(group) => match group.as_str().parse::<u32>() {
							Err(_) => continue,
							Ok(app_id) => app_id
						}
					}
				};

				let vdf = match steamy_vdf::load(&path) {
					Err(_) => continue,
					Ok(vdf) => match vdf.get("AppState") {
						None => continue,
						Some(app_state) => match app_state.as_table() {
							None => continue,
							Some(table) => table.to_owned()
						}
					}
				};

				path.pop(); path.push("common");
				
				self.apps.insert(
					app_id,
					SteamApp::new(&path, &vdf)
				);
			}
		}
	}

	pub(crate) fn discover_app(&mut self, libraryfolders: &LibraryFolders, app_id: &u32) -> Option<()> {
		for libraryfolder in &libraryfolders.paths {
			let mut appmanifest_path = libraryfolder.join(format!("appmanifest_{}.acf", app_id));
			if appmanifest_path.is_file() {
				let appmanifest_vdf = steamy_vdf::load(&appmanifest_path).ok()?;

				appmanifest_path.pop(); appmanifest_path.push("common");

				self.apps.insert(
					*app_id,
					SteamApp::new(&appmanifest_path, appmanifest_vdf.get("AppState")?.as_table()?)
				);

				return None
			}
		}

		self.apps.insert(
			*app_id,
			None
		);

		None
	}
}