pub const HEADER_PIN_PREFIX: &str = "# Header-SHA256:";
pub fn pinned_header_sha(checksums: &str) -> Option<&str> {
checksums.lines().find_map(|line| {
let rest = line.trim().strip_prefix(HEADER_PIN_PREFIX)?;
let sha = rest.trim();
(!sha.is_empty()).then_some(sha)
})
}
pub fn header_matches(pinned: &str, actual: &str) -> bool {
pinned.eq_ignore_ascii_case(actual)
}
#[cfg(test)]
mod tests {
use super::*;
const CHECKSUMS: &str = include_str!("../checksums.txt");
#[test]
fn the_committed_checksums_carry_a_header_pin() {
let sha = pinned_header_sha(CHECKSUMS).expect(
"empyrean-sys/checksums.txt must carry a `# Header-SHA256:` line — build.rs \
refuses the prebuilt download without one",
);
assert_eq!(sha.len(), 64, "header pin must be a 64-hex-digit SHA-256");
assert!(
sha.chars().all(|c| c.is_ascii_hexdigit()),
"header pin must be hex, got {sha}"
);
}
#[test]
fn a_file_with_no_pin_reads_as_absent() {
assert_eq!(
pinned_header_sha("# Pinned for v0.10.0.\nlibempyrean-macos-aarch64 abc\n"),
None,
);
assert_eq!(pinned_header_sha("# Header-SHA256: \n"), None);
}
#[test]
fn the_pin_is_read_out_of_its_comment_line() {
let file = concat!(
"# SHA-256 of each asset.\n",
"# Header-SHA256: 1c1c51d1b0fd8108\n",
"libempyrean-macos-aarch64 57b0b45a\n",
);
assert_eq!(pinned_header_sha(file), Some("1c1c51d1b0fd8108"));
}
#[test]
fn matching_is_case_insensitive_hex_but_nothing_looser() {
assert!(header_matches("ABCD", "abcd"));
assert!(!header_matches("abcd", "abce"));
assert!(!header_matches("abcd", ""));
}
}