Skip to main content

har/
loader.rs

1use crate::raw::RawDoc;
2use memmap2::Mmap;
3use std::fs::File;
4use std::path::Path;
5
6/// Load a HAR file via mmap and a single-pass typed deserialization.
7pub fn load(path: &Path) -> Result<RawDoc, LoadError> {
8    let file = File::open(path).map_err(LoadError::Io)?;
9    // SAFETY: the file is opened read-only and not mutated while mapped.
10    let mmap = unsafe { Mmap::map(&file).map_err(LoadError::Io)? };
11    let doc: RawDoc = serde_json::from_slice(&mmap).map_err(LoadError::Json)?;
12    Ok(doc)
13}
14
15#[derive(Debug, thiserror::Error)]
16pub enum LoadError {
17    #[error("failed to read HAR file")]
18    Io(#[source] std::io::Error),
19    #[error("failed to parse HAR JSON")]
20    Json(#[source] serde_json::Error),
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    fn fixture(name: &str) -> std::path::PathBuf {
28        std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
29            .join("tests/fixtures")
30            .join(name)
31    }
32
33    #[test]
34    fn loads_v1_2_fixture() {
35        let doc = load(&fixture("someapi123.har")).expect("should load");
36        assert_eq!(doc.log.version, "1.2");
37        assert!(!doc.log.entries.is_empty());
38    }
39
40    #[test]
41    fn loads_v1_3_fixture() {
42        let doc = load(&fixture("someapi13.har")).expect("should load");
43        assert_eq!(doc.log.version, "1.3");
44        assert!(!doc.log.entries.is_empty());
45    }
46}