diff options
| author | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2019-10-25 09:52:00 +0200 |
|---|---|---|
| committer | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2019-10-25 09:52:00 +0200 |
| commit | 9d3eaa7aa7e2be84e150075fb12e97083d7c61f8 (patch) | |
| tree | 0a37df89edab79f930a01d686ba65c3bc5dd8ff1 | |
| parent | 51f063aaf2cab590a6cfe42e1da3f7bbd6423ba5 (diff) | |
| download | mail-9d3eaa7aa7e2be84e150075fb12e97083d7c61f8.tar.gz | |
implement message_properties
| -rw-r--r-- | src/lib.rs | 2 | ||||
| -rw-r--r-- | src/message.rs | 20 | ||||
| -rw-r--r-- | src/message_properties.rs | 75 |
3 files changed, 97 insertions, 0 deletions
@@ -22,6 +22,7 @@ mod thread; mod threads; mod index; mod config_list; +mod message_properties; pub use database::{Database, DatabaseExt, AtomicOperation}; pub use directory::{Directory, DirectoryExt}; @@ -29,6 +30,7 @@ pub use error::Error; pub use filenames::{Filenames, FilenamesOwner}; pub use message::{Message, MessageExt, MessageOwner, FrozenMessage}; pub use messages::{Messages, MessagesExt}; +pub use message_properties::{MessageProperties}; pub use query::{Query, QueryExt}; pub use tags::{Tags, TagsExt, TagsOwner}; pub use thread::{Thread, ThreadExt}; diff --git a/src/message.rs b/src/message.rs index 77aecc3..b4eacc8 100644 --- a/src/message.rs +++ b/src/message.rs @@ -9,6 +9,7 @@ use utils::{ToStr, ScopedPhantomcow, ScopedSupercow}; use Filenames; use FilenamesOwner; use Messages; +use MessageProperties; use Tags; use TagsOwner; use IndexOpts; @@ -131,6 +132,11 @@ where pub fn thaw(self: &Self) -> Result<()> { unsafe { ffi::notmuch_message_thaw(self.ptr) }.as_result() } + + pub fn get_properties<'m>(&'m self, key: &str, exact: bool) -> MessageProperties<'m, 'o, O> + { + <Self as MessageExt<'o, O>>::get_properties(self, key, exact) + } } pub trait MessageExt<'o, O> @@ -169,6 +175,20 @@ where Supercow::phantom(messageref), ) } + + fn get_properties<'m, M>(message: M, key: &str, exact: bool) -> MessageProperties<'m, 'o, O> + where + M: Into<ScopedSupercow<'m, Message<'o, O>>>, + { + let messageref = message.into(); + let key_str = CString::new(key).unwrap(); + + let props = unsafe { + ffi::notmuch_message_get_properties(messageref.ptr, key_str.as_ptr(), exact as i32) + }; + + MessageProperties::from_ptr(props, Supercow::phantom(messageref)) + } } impl<'o, O> MessageExt<'o, O> for Message<'o, O> where O: MessageOwner + 'o {} diff --git a/src/message_properties.rs b/src/message_properties.rs new file mode 100644 index 0000000..2c2ceb0 --- /dev/null +++ b/src/message_properties.rs @@ -0,0 +1,75 @@ +use std::ops::Drop; +use std::ffi::{CStr, CString}; +use supercow::Supercow; + +use ffi; +use Message; +use MessageOwner; +use MessageExt; +use utils::{ScopedSupercow, ScopedPhantomcow}; + + +#[derive(Debug)] +pub struct MessageProperties<'m, 'o, O> +where + O: MessageOwner + 'o +{ + ptr: *mut ffi::notmuch_message_properties_t, + marker: ScopedPhantomcow<'m, Message<'o, O>>, +} + +impl<'m, 'o, O> Drop for MessageProperties<'m, 'o, O> +where + O: MessageOwner + 'o +{ + fn drop(&mut self) { + unsafe { ffi::notmuch_message_properties_destroy(self.ptr) }; + } +} + +impl<'m, 'o, O> MessageProperties<'m, 'o, O> +where + O: MessageOwner + 'o +{ + pub(crate) fn from_ptr<S>(ptr: *mut ffi::notmuch_message_properties_t, owner: S) -> MessageProperties<'m, 'o, O> + where + S: Into<ScopedPhantomcow<'m, Message<'o, O>>>, + { + MessageProperties { + ptr, + marker: owner.into(), + } + } +} + + +impl<'m, 'o, O> Iterator for MessageProperties<'m, 'o, O> +where + O: MessageOwner + 'o +{ + type Item = (String, String); + + fn next(&mut self) -> Option<Self::Item> { + let valid = unsafe { ffi::notmuch_message_properties_valid(self.ptr) }; + + if valid == 0 { + return None; + } + + let (k, v) = unsafe { + let key = CStr::from_ptr(ffi::notmuch_message_properties_key(self.ptr)); + let value = CStr::from_ptr(ffi::notmuch_message_properties_value(self.ptr)); + + ffi::notmuch_message_properties_move_to_next(self.ptr); + + (key, value) + }; + + Some((k.to_str().unwrap().to_string(), v.to_str().unwrap().to_string())) + } +} + +unsafe impl<'m, 'o, O> Send for MessageProperties<'m, 'o, O> where + O: MessageOwner + 'o {} +unsafe impl<'m, 'o, O> Sync for MessageProperties<'m, 'o, O> where + O: MessageOwner + 'o {} |
