aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDirk Van Haerenborgh <vhdirk@gmail.com>2019-10-25 09:52:00 +0200
committerDirk Van Haerenborgh <vhdirk@gmail.com>2019-10-25 09:52:00 +0200
commit9d3eaa7aa7e2be84e150075fb12e97083d7c61f8 (patch)
tree0a37df89edab79f930a01d686ba65c3bc5dd8ff1
parent51f063aaf2cab590a6cfe42e1da3f7bbd6423ba5 (diff)
downloadmail-9d3eaa7aa7e2be84e150075fb12e97083d7c61f8.tar.gz
implement message_properties
-rw-r--r--src/lib.rs2
-rw-r--r--src/message.rs20
-rw-r--r--src/message_properties.rs75
3 files changed, 97 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 69bf015..1eefaf2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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 {}