use crate::{Confidence, Detail, Evidence, Outcome};
const OGG_CAPTURE_PATTERN: [u8; 4] = *b"OggS";
pub(crate) fn probe(data: &[u8], limit: usize) -> Outcome {
debug_assert!(limit <= data.len(), "harness caps limit at data.len()");
let region = &data[..limit];
if region.len() < OGG_CAPTURE_PATTERN.len() {
return Outcome::Insufficient(OGG_CAPTURE_PATTERN.len());
}
if region[..OGG_CAPTURE_PATTERN.len()] != OGG_CAPTURE_PATTERN {
return Outcome::None;
}
Outcome::Match(Evidence {
confidence: Confidence::STRONG,
detail: Detail::None,
})
}
#[cfg(test)]
mod tests {
use super::*;
fn fixture_bytes(rel: &str) -> std::vec::Vec<u8> {
std::fs::read(std::format!("{}/../{}", env!("CARGO_MANIFEST_DIR"), rel))
.unwrap_or_else(|e| panic!("failed to read {rel}: {e}"))
}
#[test]
fn short_prefix_is_insufficient() {
let data = fixture_bytes("fixtures/container-probe/opus.ogg");
let region = &data[..OGG_CAPTURE_PATTERN.len() - 1];
match probe(region, region.len()) {
Outcome::Insufficient(n) => assert_eq!(n, OGG_CAPTURE_PATTERN.len()),
other => panic!("3-byte Ogg prefix must be Insufficient(4), got {other:?}"),
}
}
}