From e49c293b010468c7768a188e9337ba20985be8d3 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Wed, 22 Jul 2020 11:10:35 +0300 Subject: [PATCH] imap: impl DoubleEndedIterator for ImapLineIterator --- melib/src/backends/imap/protocol_parser.rs | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/melib/src/backends/imap/protocol_parser.rs b/melib/src/backends/imap/protocol_parser.rs index 7cf693985..4e16b2360 100644 --- a/melib/src/backends/imap/protocol_parser.rs +++ b/melib/src/backends/imap/protocol_parser.rs @@ -299,6 +299,31 @@ fn test_imap_response() { assert_eq!(ImapResponse::from("M12 NO [CANNOT] Invalid mailbox name: Name must not have \'/\' characters (0.000 + 0.098 + 0.097 secs).\r\n"), ImapResponse::No(ResponseCode::Alert("Invalid mailbox name: Name must not have '/' characters".to_string()))); } +impl<'a> std::iter::DoubleEndedIterator for ImapLineIterator<'a> { + fn next_back(&mut self) -> Option { + if self.slice.is_empty() { + None + } else if let Some(pos) = self.slice.rfind("\r\n") { + if self.slice[..pos].is_empty() { + self.slice = &self.slice[..pos]; + None + } else if let Some(prev_pos) = self.slice[..pos].rfind("\r\n") { + let ret = &self.slice[prev_pos + 2..pos + 2]; + self.slice = &self.slice[..prev_pos + 2]; + Some(ret) + } else { + let ret = self.slice; + self.slice = &self.slice[ret.len()..]; + Some(ret) + } + } else { + let ret = self.slice; + self.slice = &self.slice[ret.len()..]; + Some(ret) + } + } +} + impl<'a> Iterator for ImapLineIterator<'a> { type Item = &'a str;