From 6bc832acbab27328035710496894cd68add88962 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Mon, 6 Jun 2016 10:01:45 -0400 Subject: Add some mapping functions to more easily extract mail headers --- src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index f82c1a9..d70fb16 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -271,6 +271,32 @@ pub fn parse_header(raw_data: &str) -> Result<(MailHeader, usize), MailParseErro } } +pub trait MailHeaderMap { + fn get_first_value(&self, key: &str) -> Option; + fn get_all_values(&self, key: &str) -> Vec; +} + +impl<'a> MailHeaderMap for Vec> { + fn get_first_value(&self, key: &str) -> Option { + for x in self { + if x.get_key() == key { + return Some(x.get_value()); + } + } + None + } + + fn get_all_values(&self, key: &str) -> Vec { + let mut values: Vec = Vec::new(); + for x in self { + if x.get_key() == key { + values.push(x.get_value()); + } + } + values + } +} + pub fn parse_headers(raw_data: &str) -> Result<(Vec, usize), MailParseError> { let mut headers: Vec = Vec::new(); let mut ix = 0; @@ -418,6 +444,15 @@ mod tests { assert_eq!(parsed[0].key, "Return-Path"); assert_eq!(parsed[9].key, "Message-Id"); + let (parsed, _) = parse_headers("Key: Value\nAnotherKey: AnotherValue\nKey: Value2\nKey: Value3\n").unwrap(); + assert_eq!(parsed.len(), 4); + assert_eq!(parsed.get_first_value("Key"), Some("Value".to_string())); + assert_eq!(parsed.get_all_values("Key"), vec!["Value", "Value2", "Value3"]); + assert_eq!(parsed.get_first_value("AnotherKey"), Some("AnotherValue".to_string())); + assert_eq!(parsed.get_all_values("AnotherKey"), vec!["AnotherValue"]); + assert_eq!(parsed.get_first_value("NoKey"), None); + assert_eq!(parsed.get_all_values("NoKey"), Vec::::new()); + assert_eq!(parse_headers("Bad\nKey").unwrap_err().position, 3); assert_eq!(parse_headers("K:V\nBad\nKey").unwrap_err().position, 7); } -- cgit v1.2.3