use sha2::Digest as _;
pub fn sha256_hex(data: &[u8]) -> String {
format!("{:x}", sha2::Sha256::digest(data))
}
pub fn sha256_digest(data: &[u8]) -> String {
format!("sha256:{}", sha256_hex(data))
}
pub fn strip_sha256_prefix(s: &str) -> &str {
s.strip_prefix("sha256:").unwrap_or(s)
}
pub fn parse_loose_version(s: &str) -> Option<semver::Version> {
let s = s.strip_prefix(['v', 'V']).unwrap_or(s);
if let Ok(ver) = semver::Version::parse(s) {
return Some(ver);
}
if s.matches('.').count() == 1
&& let Ok(ver) = semver::Version::parse(&format!("{s}.0"))
{
return Some(ver);
}
if !s.contains('.')
&& let Ok(ver) = semver::Version::parse(&format!("{s}.0.0"))
{
return Some(ver);
}
None
}
pub fn version_satisfies(version_str: &str, requirement_str: &str) -> bool {
let req = match semver::VersionReq::parse(requirement_str) {
Ok(r) => r,
Err(_) => return false,
};
parse_loose_version(version_str)
.map(|ver| req.matches(&ver))
.unwrap_or(false)
}