diff --git a/src/lib.rs b/src/lib.rs index 6204ffa..6a5f824 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,6 +80,54 @@ impl ModInfo { pub fn version_string(&self) -> String { format!("{}.{}.{}", self.version.0, self.version.1, self.version.2) } + + /// Does the mod satisfy a dependency string? + pub fn satisfies(&self, dependency_string: &str) -> bool { + let version_str_index = match dependency_string.rfind('-') { + Some(index) => index, + None => return false, + }; + if &dependency_string[0..version_str_index] != format!("{}-{}", self.author, self.name) { + return false; + } + + let version_string = &dependency_string[version_str_index + 1..]; + let mut iter = version_string.split('.'); + let major = iter + .next() + .and_then(|str| i64::from_str_radix(str, 10).ok()); + let minor = iter + .next() + .and_then(|str| i64::from_str_radix(str, 10).ok()); + let patch = iter + .next() + .and_then(|str| i64::from_str_radix(str, 10).ok()); + if iter.count() > 0 { + return false; + } + let version = match (major, minor, patch) { + (Some(major), Some(minor), Some(patch)) => (major, minor, patch), + _ => return false, + }; + + // Mods probably don't follow semantic versioning that closely, so just assume that bigger + // is better. + match self.version.0.cmp(&version.0) { + Greater => return true, + Less => return false, + Equal => (), + }; + match self.version.1.cmp(&version.1) { + Greater => return true, + Less => return false, + Equal => (), + }; + match self.version.2.cmp(&version.2) { + Greater => true, + Less => false, + Equal => true, + } + } } pub struct FetchExtractor { @@ -226,7 +274,8 @@ pub fn data_dir() -> PathBuf { pub fn game_dir() -> PathBuf { match var("GAME_DIR").ok() { Some(game_dir) => game_dir.into(), - None => PathBuf::from(var("HOME").unwrap()) - .join("steam/SteamLibrary/steamapps/common/Lethal Company"), + None => { + PathBuf::from(var("HOME").unwrap()).join(".steam/steam/steamapps/common/Lethal Company") + } } }