Fixed #492 Fixed #510 Fixed #506 Fixed #568 Fixed #582 Fixed #578 Fixed #567 Fixed #588 Fixed #585 Fixed #571 Fixed #587 Fixed #584
56 lines
1.5 KiB
Rust
56 lines
1.5 KiB
Rust
use freya::query::QueryStateData;
|
|
use oneclient_core::VersionMetadata;
|
|
use oneclient_core::packages::domain::GameLoader;
|
|
|
|
use super::use_versions;
|
|
|
|
pub fn pick_version_metadata(
|
|
list: &[VersionMetadata],
|
|
major: u32,
|
|
minor: Option<u32>,
|
|
loader: Option<GameLoader>,
|
|
) -> Option<VersionMetadata> {
|
|
let loader_matches = |m: &VersionMetadata| match (&m.loader, loader) {
|
|
(Some(s), Some(l)) => l.to_string().eq_ignore_ascii_case(s),
|
|
_ => false,
|
|
};
|
|
|
|
if let Some(minor) = minor {
|
|
if let Some(hit) = list.iter().find(|m| {
|
|
m.major_version == major && m.minor_version == Some(minor) && loader_matches(m)
|
|
}) {
|
|
return Some(hit.clone());
|
|
}
|
|
if let Some(hit) = list
|
|
.iter()
|
|
.find(|m| m.major_version == major && m.minor_version == Some(minor))
|
|
{
|
|
return Some(hit.clone());
|
|
}
|
|
}
|
|
|
|
list.iter()
|
|
.find(|m| m.major_version == major && m.minor_version.is_none())
|
|
.cloned()
|
|
}
|
|
|
|
pub fn use_version_metadata(
|
|
major: Option<u32>,
|
|
minor: Option<u32>,
|
|
loader: Option<GameLoader>,
|
|
) -> Option<VersionMetadata> {
|
|
let versions_query = use_versions();
|
|
|
|
let major = major?;
|
|
let reader = versions_query.read();
|
|
let state = reader.state();
|
|
let list = match &*state {
|
|
QueryStateData::Settled { res: Ok(list), .. } => list,
|
|
QueryStateData::Loading {
|
|
res: Some(Ok(list)),
|
|
} => list,
|
|
_ => return None,
|
|
};
|
|
|
|
pick_version_metadata(list, major, minor, loader)
|
|
}
|