diff --git a/src/bin/fingerprint.rs b/src/bin/fingerprint.rs index 595a026..d2e4431 100644 --- a/src/bin/fingerprint.rs +++ b/src/bin/fingerprint.rs @@ -32,6 +32,10 @@ struct Args { #[arg(short, long, default_value_t = 10)] top_n: usize, + /// Include subpart params in fingerprint + #[arg(short, long)] + include_params: bool, + /// List of input directories to recursively search input_dir: String, } @@ -68,7 +72,7 @@ fn main() -> anyhow::Result<()> { if should_skip(&arg) { return None; } - match parse(&arg, youngest) { + match parse(&arg, youngest, args.include_params) { Ok(Some(h)) => Some((h, arg)), // Skip old emails Ok(None) => return None, @@ -116,7 +120,11 @@ fn main() -> anyhow::Result<()> { } // If the date in the email is before youngest Ok(None) will be returned. -fn parse>(path: P, youngest: i64) -> Result, EmailError> { +fn parse>( + path: P, + youngest: i64, + include_params: bool, +) -> Result, EmailError> { let file = File::open(&path)?; let mmap = unsafe { MmapOptions::new().map(&file)? }; let m = parse_mail(&mmap)?; @@ -131,5 +139,5 @@ fn parse>(path: P, youngest: i64) -> Result, Email return Ok(None); } //println!("{}: {:#?}", path.as_ref().display(), m.ctype); - Ok(Some(fingerprint(&m).join("\n"))) + Ok(Some(fingerprint(&m, include_params).join("\n"))) } diff --git a/src/bin/summarize.rs b/src/bin/summarize.rs index 0f5b6ea..bed3e24 100644 --- a/src/bin/summarize.rs +++ b/src/bin/summarize.rs @@ -23,7 +23,7 @@ fn main() -> anyhow::Result<()> { .headers .get_first_value("subject") .unwrap_or("(NO SUBJECT)".to_owned()); - println!("{subject}: {path}\n{}", fingerprint(&m).join("\n")); + println!("{subject}: {path}\n{}", fingerprint(&m, false).join("\n")); } Ok(()) } diff --git a/src/lib.rs b/src/lib.rs index 96eea49..756b98a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -65,15 +65,19 @@ pub fn should_skip(path: &str) -> bool { SKIP_FILES.contains(&filename) } -pub fn fingerprint(pm: &ParsedMail<'_>) -> Vec { - fingerprint_rec(pm, 0) +pub fn fingerprint(pm: &ParsedMail<'_>, include_params: bool) -> Vec { + fingerprint_rec(pm, include_params, 0) } -fn fingerprint_rec(pm: &ParsedMail<'_>, depth: usize) -> Vec { - let mut v = vec![format!("{}{}", " ".repeat(depth * 2), pm.ctype.mimetype)]; - for c in &pm.subparts { - v.extend(fingerprint_rec(&c, depth + 1)); +fn fingerprint_rec(pm: &ParsedMail<'_>, include_params: bool, depth: usize) -> Vec { + let indent = " ".repeat(depth * 2); + let mut parts = vec![format!("{}{}", indent, pm.ctype.mimetype)]; + for (k, v) in &pm.ctype.params { + parts.push(format!("{indent} {k}: {v}")); } - v + for c in &pm.subparts { + parts.extend(fingerprint_rec(&c, include_params, depth + 1)); + } + parts } #[cfg(test)]