diff --git a/parsers/ChangeLog b/parsers/ChangeLog index 56fdb326b03cf7cbd0495c5fb33d6de86e961985..9697a51a9803ddc8d700859b90860e1ae459ba1b 100644 --- a/parsers/ChangeLog +++ b/parsers/ChangeLog @@ -51,6 +51,8 @@ XXXX-YY-ZZ RELEASER the size of these elements (!472). - Add Message::extract_valid_payload method to warn in case of failure and return simply Option instead of Result> (!497) + - Add Message::get_best_body_owned and Message::get_best_subject_owned + for best developer experience when performance is not an issue (!497) Version 0.21.0: 2024-07-25 Emmanuel Gil Peyrot diff --git a/parsers/src/message.rs b/parsers/src/message.rs index e6eaf7cd43c34c2cc7cfcb4c78c3ff49a179774f..5f8e3570e48a10f3cca2ff03b8caef04af3edf4a 100644 --- a/parsers/src/message.rs +++ b/parsers/src/message.rs @@ -183,6 +183,17 @@ impl Message { map.iter().map(|(lang, value)| (lang.clone(), value)).next() } + fn get_best_owned>( + map: &BTreeMap, + preferred_langs: Vec<&str>, + ) -> Option<(Lang, T)> { + if let Some((lang, item)) = Self::get_best::(map, preferred_langs) { + Some((lang, item.to_owned())) + } else { + None + } + } + /// Returns the best matching body from a list of languages. /// /// For instance, if a message contains both an xml:lang='de', an xml:lang='fr' and an English @@ -194,6 +205,11 @@ impl Message { Message::get_best::(&self.bodies, preferred_langs) } + /// Owned variant of [`Message::get_best_body`] + pub fn get_best_body_owned(&self, preferred_langs: Vec<&str>) -> Option<(Lang, Body)> { + Message::get_best_owned::(&self.bodies, preferred_langs) + } + /// Returns the best matching subject from a list of languages. /// /// For instance, if a message contains both an xml:lang='de', an xml:lang='fr' and an English @@ -205,6 +221,11 @@ impl Message { Message::get_best::(&self.subjects, preferred_langs) } + /// Owned variant of [`Message::get_best_subject`] + pub fn get_best_subject_owned(&self, preferred_langs: Vec<&str>) -> Option<(Lang, Subject)> { + Message::get_best_owned::(&self.subjects, preferred_langs) + } + /// Try to extract the given payload type from the message's payloads. /// /// Returns the first matching payload element as parsed struct or its @@ -478,6 +499,13 @@ mod tests { assert_eq!(subject, &Subject::from_str("Hello world!").unwrap()); } + // Test owned variant. + { + let (lang, subject) = message.get_best_subject_owned(vec!["en"]).unwrap(); + assert_eq!(lang, ""); + assert_eq!(subject, Subject::from_str("Hello world!").unwrap()); + } + let elem2 = message.into(); assert_eq!(elem1, elem2); } @@ -518,6 +546,13 @@ mod tests { assert_eq!(body, &Body::from_str("Hello world!").unwrap()); } + // Test owned variant. + { + let (lang, body) = message.get_best_body_owned(vec!["ja"]).unwrap(); + assert_eq!(lang, ""); + assert_eq!(body, Body::from_str("Hello world!").unwrap()); + } + let message = Message::new(None); // Tests without a body.