diff options
| author | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-10-16 21:01:58 +0200 |
|---|---|---|
| committer | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-10-24 07:12:55 +0200 |
| commit | a4ffe47c51d1617fc0e728c7bbd7e9b3738878cb (patch) | |
| tree | 017d0717ac8e2d5e0f6a46e47ea9e731ce63697b /src/message.rs | |
| parent | b93d4cb749714699b44b2566e50a7086c2854ac7 (diff) | |
| download | mail-a4ffe47c51d1617fc0e728c7bbd7e9b3738878cb.tar.gz | |
some tries towards better lifetimes
Diffstat (limited to 'src/message.rs')
| -rw-r--r-- | src/message.rs | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/src/message.rs b/src/message.rs index 086670c..ddcb356 100644 --- a/src/message.rs +++ b/src/message.rs @@ -8,22 +8,39 @@ use error::{Error, Result}; use ffi; use utils::{ ToStr, - NewFromPtr + FromPtr }; use Query; use Messages; use Filenames; use Tags; + #[derive(Debug)] -pub struct Message<'d:'q, 'q>( - pub(crate) *mut ffi::notmuch_message_t, - PhantomData<&'q Query<'d>>, -); - -impl<'d, 'q> NewFromPtr<*mut ffi::notmuch_message_t> for Message<'d, 'q> { - fn new(ptr: *mut ffi::notmuch_message_t) -> Message<'d, 'q> { - Message(ptr, PhantomData) +pub(crate) struct MessagePtr { + pub ptr: *mut ffi::notmuch_message_t +} + +impl Drop for MessagePtr { + fn drop(&mut self) { + unsafe { + ffi::notmuch_message_destroy(self.ptr) + }; + } +} + +#[derive(Debug)] +pub struct Message<'d:'q, 'q>{ + pub(crate) handle: MessagePtr, + phantom: PhantomData<&'q Query<'d>>, +} + +impl<'d, 'q> FromPtr<*mut ffi::notmuch_message_t> for Message<'d, 'q> { + fn from_ptr(ptr: *mut ffi::notmuch_message_t) -> Message<'d, 'q> { + Message{ + handle: MessagePtr{ptr}, + phantom: PhantomData + } } } @@ -31,46 +48,46 @@ impl<'d, 'q> Message<'d, 'q>{ pub fn id(self: &Self) -> String{ let mid = unsafe { - ffi::notmuch_message_get_message_id(self.0) + ffi::notmuch_message_get_message_id(self.handle.ptr) }; mid.to_str().unwrap().to_string() } pub fn thread_id(self: &Self) -> String{ let tid = unsafe { - ffi::notmuch_message_get_thread_id(self.0) + ffi::notmuch_message_get_thread_id(self.handle.ptr) }; tid.to_str().unwrap().to_string() } pub fn replies(self: &'q Self) -> Messages<'d, 'q>{ - Messages::new(unsafe { - ffi::notmuch_message_get_replies(self.0) + Messages::from_ptr(unsafe { + ffi::notmuch_message_get_replies(self.handle.ptr) }) } #[cfg(feature = "v0_26")] pub fn count_files(self: &Self) -> i32{ unsafe { - ffi::notmuch_message_count_files(self.0) + ffi::notmuch_message_count_files(self.handle.ptr) } } pub fn filenames(self: &'d Self) -> Filenames<'d>{ - Filenames::new(unsafe { - ffi::notmuch_message_get_filenames(self.0) + Filenames::from_ptr(unsafe { + ffi::notmuch_message_get_filenames(self.handle.ptr) }) } pub fn filename(self: &Self) -> PathBuf{ PathBuf::from(unsafe { - ffi::notmuch_message_get_filename(self.0) + ffi::notmuch_message_get_filename(self.handle.ptr) }.to_str().unwrap()) } pub fn header(&self, name: &str) -> Result<&str> { let ret = unsafe { - ffi::notmuch_message_get_header(self.0, + ffi::notmuch_message_get_header(self.handle.ptr, CString::new(name).unwrap().as_ptr()) }; if ret.is_null() { @@ -81,20 +98,11 @@ impl<'d, 'q> Message<'d, 'q>{ } pub fn tags(self: &'d Self) -> Tags<'d>{ - Tags::new(unsafe { - ffi::notmuch_message_get_tags(self.0) + Tags::from_ptr(unsafe { + ffi::notmuch_message_get_tags(self.handle.ptr) }) } } - -impl<'d, 'q> Drop for Message<'d, 'q> { - fn drop(self: &mut Self) { - unsafe { - ffi::notmuch_message_destroy(self.0) - }; - } -} - unsafe impl<'d, 'q> Send for Message<'d, 'q>{} unsafe impl<'d, 'q> Sync for Message<'d, 'q>{} |
