1#![allow(clippy::unwrap_used, clippy::expect_used)]
7use std::path::PathBuf;
8
9fn main() {
15 let mut root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
16 root.pop();
17 let out_dir = std::env::args()
18 .nth(1)
19 .unwrap_or_else(|| "/tmp/pf_scca".to_string());
20 std::fs::create_dir_all(&out_dir).expect("mkdir out_dir");
21
22 for name in [
23 "COREUPDATER.EXE-157C54BB.pf",
24 "AUDIODG.EXE-AB22E9A6.pf",
25 "AM_DELTA.EXE-78CA83B0.pf",
26 ] {
27 let p = root.join("tests/data").join(name);
28 let raw = std::fs::read(&p).expect("read fixture");
29 let scca = prefetch_core::decompress(&raw).expect("decompress");
30 std::fs::write(PathBuf::from(&out_dir).join(format!("{name}.scca")), &scca)
33 .expect("write scca");
34
35 let info = prefetch_core::parse(&raw).expect("parse");
36 let files: Vec<String> = info.filenames.iter().map(|f| escape(f)).collect();
37 let vols: Vec<String> = info
38 .volumes
39 .iter()
40 .map(|v| {
41 format!(
42 "{{\"serial\":{},\"device_path\":\"{}\",\"creation_time\":{}}}",
43 v.serial,
44 escape(&v.device_path),
45 v.creation_time
46 )
47 })
48 .collect();
49 println!(
50 "{{\"file\":\"{}\",\"scca_len\":{},\"version\":{},\"executable\":\"{}\",\"run_count\":{},\"last_run_times\":{:?},\"filenames_count\":{},\"filenames\":[{}],\"volumes\":[{}]}}",
51 name,
52 scca.len(),
53 info.version,
54 escape(&info.executable),
55 info.run_count,
56 info.last_run_times,
57 info.filenames.len(),
58 files.iter().map(|f| format!("\"{f}\"")).collect::<Vec<_>>().join(","),
59 vols.join(",")
60 );
61 }
62}
63
64fn escape(s: &str) -> String {
65 s.replace('\\', "\\\\")
66}