1use crate::raw::RawDoc;
2use memmap2::Mmap;
3use std::fs::File;
4use std::path::Path;
5
6pub fn load(path: &Path) -> Result<RawDoc, LoadError> {
8 let file = File::open(path).map_err(LoadError::Io)?;
9 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}