use semver::Version;
#[derive(Debug, Clone)]
pub struct Release {
pub id: String,
pub changelog: String,
pub version: Version,
pub prerelease: bool,
pub variant: Option<ReleaseVariant>,
}
impl Release {
pub fn get_variant(&self) -> Option<&ReleaseVariant> {
self.variant.as_ref()
}
pub fn get_latest<'a, I>(releases: I) -> Option<&'a Self>
where
I: IntoIterator<Item = &'a Self>,
{
let mut latest: Option<&Self> = None;
for r in releases {
match latest {
Some(lr) if r.version > lr.version => latest = Some(r),
None => latest = Some(r),
_ => {}
}
}
latest
}
}
impl PartialEq<Release> for Release {
fn eq(&self, other: &Release) -> bool {
self.id == other.id
}
}
impl std::fmt::Display for Release {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.prerelease {
false => write!(f, "{}", &self.id),
true => write!(f, "{}-beta", &self.id),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReleaseVariant {
pub name: String,
pub sha256: Option<String>,
}
impl std::fmt::Display for ReleaseVariant {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", &self.name)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn variant(name: &str) -> ReleaseVariant {
ReleaseVariant {
name: name.to_string(),
sha256: None,
}
}
#[test]
fn test_get_latest() {
assert_eq!(Release::get_latest(vec![]), None);
let releases = [
Release {
id: "1".to_string(),
changelog: "".to_string(),
version: "1.1.7".parse().unwrap(),
prerelease: false,
variant: None,
},
Release {
id: "0".to_string(),
changelog: "".to_string(),
version: "1.0.0".parse().unwrap(),
prerelease: false,
variant: None,
},
Release {
id: "3".to_string(),
changelog: "".to_string(),
version: "2.3.1".parse().unwrap(),
prerelease: false,
variant: None,
},
Release {
id: "2".to_string(),
changelog: "".to_string(),
version: "2.1.0".parse().unwrap(),
prerelease: false,
variant: None,
},
];
assert_eq!(
Release::get_latest(releases.iter()).map(|r| r.id.as_str()),
Some("3")
);
}
#[test]
fn test_get_variant() {
let with = Release {
id: "v1".to_string(),
changelog: "".to_string(),
version: "1.0.0".parse().unwrap(),
prerelease: false,
variant: Some(variant("myapp-linux-amd64")),
};
assert_eq!(with.get_variant(), Some(&variant("myapp-linux-amd64")));
let without = Release {
id: "v1".to_string(),
changelog: "".to_string(),
version: "1.0.0".parse().unwrap(),
prerelease: false,
variant: None,
};
assert_eq!(without.get_variant(), None);
}
}