use crate::{semver, Config};
use rust_releases::linear::LatestStableReleases;
use rust_releases::Release;
pub fn filter_releases(config: &Config, releases: &[Release]) -> Vec<Release> {
let releases = if config.include_all_patch_releases() {
releases.to_vec()
} else {
releases.iter().cloned().latest_stable_releases().collect()
};
releases
.into_iter()
.filter(|release| {
include_version(
release.version(),
config.minimum_version(),
config.maximum_version(),
)
})
.collect::<Vec<_>>()
}
fn include_version(
current: &semver::Version,
min_version: Option<&semver::Version>,
max_version: Option<&semver::Version>,
) -> bool {
match (min_version, max_version) {
(Some(min), Some(max)) => current >= min && current <= max,
(Some(min), None) => current >= min,
(None, Some(max)) => current <= max,
(None, None) => true,
}
}
#[cfg(test)]
mod tests {
use parameterized::{ide, parameterized};
use rust_releases::semver::Version;
use super::*;
ide!();
#[parameterized(current = {
50, // -inf <= x <= inf
50, // 1.50.0 <= x <= inf
50, // -inf <= x <= 1.50.0
50, // 1.50.0 <= x <= 1.50.0
50, // 1.49.0 <= x <= 1.50.0
}, min = {
None,
Some(50),
None,
Some(50),
Some(49),
}, max = {
None,
None,
Some(50),
Some(50),
Some(50),
})]
fn test_included_versions(current: u64, min: Option<u64>, max: Option<u64>) {
let current = Version::new(1, current, 0);
let min_version = min.map(|m| Version::new(1, m, 0));
let max_version = max.map(|m| Version::new(1, m, 0));
assert!(include_version(
¤t,
min_version.as_ref(),
max_version.as_ref()
));
}
#[parameterized(current = {
50, // -inf <= x <= 1.49.0 : false
50, // 1.51 <= x <= inf : false
50, // 1.51 <= x <= 1.52.0 : false
50, // 1.48 <= x <= 1.49.0 : false
}, min = {
None,
Some(51),
Some(51),
Some(48),
}, max = {
Some(49),
None,
Some(52),
Some(49),
})]
fn test_excluded_versions(current: u64, min: Option<u64>, max: Option<u64>) {
let current = Version::new(1, current, 0);
let min_version = min.map(|m| Version::new(1, m, 0));
let max_version = max.map(|m| Version::new(1, m, 0));
assert!(!include_version(
¤t,
min_version.as_ref(),
max_version.as_ref()
));
}
}