diff options
| author | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-11-01 21:55:00 +0100 |
|---|---|---|
| committer | Dirk Van Haerenborgh <vhdirk@gmail.com> | 2018-11-01 21:55:00 +0100 |
| commit | 7d2be237297c16628cb3d58774e808cac9c92fc1 (patch) | |
| tree | 55cb240828bac9968f94166e740b567b66928e3b /src/message.rs | |
| parent | 2932d67d87fa2ff41fcdf46ce269ba5b49294930 (diff) | |
| download | mail-7d2be237297c16628cb3d58774e808cac9c92fc1.tar.gz | |
improve lifetime management with supercow
Diffstat (limited to 'src/message.rs')
| -rw-r--r-- | src/message.rs | 120 |
1 files changed, 55 insertions, 65 deletions
diff --git a/src/message.rs b/src/message.rs index af04cec..624817d 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,103 +1,92 @@ +use std::ffi::CString; use std::ops::Drop; -use std::marker::PhantomData; use std::path::PathBuf; -use std::ffi::CString; +use supercow::Phantomcow; use error::{Error, Result}; - use ffi; -use utils::{ - ToStr, - FromPtr -}; -use Query; -use Messages; +use utils::ToStr; use Filenames; +use FilenamesOwner; +use Messages; +use MessagesOwner; use Tags; -use messages::MessagesOwner; -use filenames::FilenamesOwner; -use tags::TagsOwner; +use TagsOwner; -pub trait MessageOwner{} +pub trait MessageOwner {} #[derive(Debug)] pub(crate) struct MessagePtr { - pub ptr: *mut ffi::notmuch_message_t + pub ptr: *mut ffi::notmuch_message_t, } impl Drop for MessagePtr { fn drop(&mut self) { - unsafe { - ffi::notmuch_message_destroy(self.ptr) - }; + unsafe { ffi::notmuch_message_destroy(self.ptr) }; } } - + #[derive(Debug)] -pub struct Message<'o, Owner: MessageOwner + 'o>{ +pub struct Message<'o, Owner: MessageOwner + 'o> { pub(crate) handle: MessagePtr, - phantom: PhantomData<&'o Owner>, + marker: Phantomcow<'o, Owner>, } -impl<'o, Owner: MessageOwner + 'o> MessagesOwner for Message<'o, Owner>{} -impl<'o, Owner: MessageOwner + 'o> FilenamesOwner for Message<'o, Owner>{} -impl<'o, Owner: MessageOwner + 'o> TagsOwner for Message<'o, Owner>{} - - -impl<'o, Owner: MessageOwner + 'o> FromPtr<*mut ffi::notmuch_message_t> for Message<'o, Owner> { - fn from_ptr(ptr: *mut ffi::notmuch_message_t) -> Message<'o, Owner> { - Message{ - handle: MessagePtr{ptr}, - phantom: PhantomData +impl<'o, Owner: MessageOwner + 'o> MessagesOwner for Message<'o, Owner> {} +impl<'o, Owner: MessageOwner + 'o> FilenamesOwner for Message<'o, Owner> {} +impl<'o, Owner: MessageOwner + 'o> TagsOwner for Message<'o, Owner> {} + +impl<'o, Owner: MessageOwner + 'o> Message<'o, Owner> { + pub fn from_ptr<O: Into<Phantomcow<'o, Owner>>>( + ptr: *mut ffi::notmuch_message_t, + owner: O, + ) -> Message<'o, Owner> { + Message { + handle: MessagePtr { ptr }, + marker: owner.into(), } } -} - -impl<'o, Owner: MessageOwner + 'o> Message<'o, Owner>{ - pub fn id(self: &Self) -> String{ - let mid = unsafe { - ffi::notmuch_message_get_message_id(self.handle.ptr) - }; + pub fn id(self: &Self) -> String { + let mid = unsafe { 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.handle.ptr) - }; + pub fn thread_id(self: &Self) -> String { + let tid = unsafe { ffi::notmuch_message_get_thread_id(self.handle.ptr) }; tid.to_str().unwrap().to_string() } - pub fn replies(self: &Self) -> Messages<'o, Self>{ - Messages::from_ptr(unsafe { - ffi::notmuch_message_get_replies(self.handle.ptr) - }) + pub fn replies<'s>(self: &'s Self) -> Messages<'s, Self> { + Messages::from_ptr( + unsafe { ffi::notmuch_message_get_replies(self.handle.ptr) }, + self, + ) } #[cfg(feature = "v0_26")] - pub fn count_files(self: &Self) -> i32{ - unsafe { - ffi::notmuch_message_count_files(self.handle.ptr) - } + pub fn count_files(self: &Self) -> i32 { + unsafe { ffi::notmuch_message_count_files(self.handle.ptr) } } - pub fn filenames(self: &Self) -> Filenames<Self>{ - Filenames::from_ptr(unsafe { - ffi::notmuch_message_get_filenames(self.handle.ptr) - }) + pub fn filenames(self: &Self) -> Filenames<Self> { + Filenames::from_ptr( + unsafe { ffi::notmuch_message_get_filenames(self.handle.ptr) }, + self, + ) } - pub fn filename(self: &Self) -> PathBuf{ - PathBuf::from(unsafe { - ffi::notmuch_message_get_filename(self.handle.ptr) - }.to_str().unwrap()) + pub fn filename(self: &Self) -> PathBuf { + PathBuf::from( + unsafe { 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.handle.ptr, - CString::new(name).unwrap().as_ptr()) + ffi::notmuch_message_get_header(self.handle.ptr, CString::new(name).unwrap().as_ptr()) }; if ret.is_null() { Err(Error::UnspecifiedError) @@ -106,12 +95,13 @@ impl<'o, Owner: MessageOwner + 'o> Message<'o, Owner>{ } } - pub fn tags<'m>(self: &Self) -> Tags<'m, Self>{ - Tags::from_ptr(unsafe { - ffi::notmuch_message_get_tags(self.handle.ptr) - }) + pub fn tags<'m>(&'m self) -> Tags<'m, Self> { + Tags::from_ptr( + unsafe { ffi::notmuch_message_get_tags(self.handle.ptr) }, + self, + ) } } -unsafe impl<'o, Owner: MessageOwner + 'o> Send for Message<'o, Owner>{} -unsafe impl<'o, Owner: MessageOwner + 'o> Sync for Message<'o, Owner>{} +unsafe impl<'o, Owner: MessageOwner + 'o> Send for Message<'o, Owner> {} +unsafe impl<'o, Owner: MessageOwner + 'o> Sync for Message<'o, Owner> {} |
