use crate::{Confidence, Detail, Evidence, Outcome};
const RIFF_SIGNATURE: [u8; 4] = *b"RIFF";
const WAVE_FORM_TYPE: [u8; 4] = *b"WAVE";
const WAVE_OFFSET: usize = 8;
pub(crate) fn probe(data: &[u8], limit: usize) -> Outcome {
debug_assert!(limit <= data.len(), "harness caps limit at data.len()");
let region = &data[..limit];
let need = WAVE_OFFSET + WAVE_FORM_TYPE.len();
if region.len() < need {
return Outcome::Insufficient(need);
}
if region[..RIFF_SIGNATURE.len()] != RIFF_SIGNATURE {
return Outcome::None;
}
if region[WAVE_OFFSET..WAVE_OFFSET + WAVE_FORM_TYPE.len()] != WAVE_FORM_TYPE {
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/pcm_s16le.wav");
let need = WAVE_OFFSET + WAVE_FORM_TYPE.len();
let region = &data[..need - 1];
match probe(region, region.len()) {
Outcome::Insufficient(n) => assert_eq!(n, need),
other => panic!("11-byte RIFF prefix must be Insufficient(12), got {other:?}"),
}
}
}