diff --git a/src/page.rs b/src/page.rs index 7733311..3a47ce6 100644 --- a/src/page.rs +++ b/src/page.rs @@ -7,16 +7,6 @@ use url::Url; use http_send::HttpSend; -/// Represents a single page of API results -#[derive(Debug, Clone)] -pub struct Page<'a, T: for<'de> Deserialize<'de>, H: 'a + HttpSend> { - mastodon: &'a Mastodon, - next: Option, - prev: Option, - /// Initial set of items - pub initial_items: Vec, -} - macro_rules! pages { ($($direction:ident: $fun:ident),*) => { @@ -43,6 +33,77 @@ macro_rules! pages { } } +/// Owned version of the `Page` struct in this module. Allows this to be more +/// easily stored for later use +/// +/// # Example +/// +/// ```no_run +/// # extern crate elefren; +/// # use elefren::Mastodon; +/// # use elefren::page::OwnedPage; +/// # use elefren::http_send::HttpSender; +/// # use elefren::entities::status::Status; +/// # use std::cell::RefCell; +/// # use elefren::prelude::*; +/// # fn main() -> Result<(), elefren::Error> { +/// # let data = Data { +/// # base: "".into(), +/// # client_id: "".into(), +/// # client_secret: "".into(), +/// # redirect: "".into(), +/// # token: "".into(), +/// # }; +/// struct HomeTimeline { +/// client: Mastodon, +/// page: RefCell>>, +/// } +/// let client = Mastodon::from(data); +/// let home = client.get_home_timeline()?.to_owned(); +/// let tl = HomeTimeline { +/// client, +/// page: RefCell::new(Some(home)), +/// }; +/// # Ok(()) +/// # } +/// ``` +#[derive(Debug, Clone)] +pub struct OwnedPage Deserialize<'de>, H: HttpSend> { + mastodon: Mastodon, + next: Option, + prev: Option, + /// Initial set of items + pub initial_items: Vec, +} + +impl Deserialize<'de>, H: HttpSend> OwnedPage { + pages! { + next: next_page, + prev: prev_page + } +} + +impl<'a, T: for<'de> Deserialize<'de>, H: HttpSend> From> for OwnedPage { + fn from(page: Page<'a, T, H>) -> OwnedPage { + OwnedPage { + mastodon: page.mastodon.clone(), + next: page.next, + prev: page.prev, + initial_items: page.initial_items, + } + } +} + +/// Represents a single page of API results +#[derive(Debug, Clone)] +pub struct Page<'a, T: for<'de> Deserialize<'de>, H: 'a + HttpSend> { + mastodon: &'a Mastodon, + next: Option, + prev: Option, + /// Initial set of items + pub initial_items: Vec, +} + impl<'a, T: for<'de> Deserialize<'de>, H: HttpSend> Page<'a, T, H> { pages! { next: next_page, @@ -61,6 +122,44 @@ impl<'a, T: for<'de> Deserialize<'de>, H: HttpSend> Page<'a, T, H> { } impl<'a, T: Clone + for<'de> Deserialize<'de>, H: HttpSend> Page<'a, T, H> { + /// Returns an owned version of this struct that doesn't borrow the client + /// that created it + /// + /// # Example + /// + /// ```no_run + /// # extern crate elefren; + /// # use elefren::Mastodon; + /// # use elefren::page::OwnedPage; + /// # use elefren::http_send::HttpSender; + /// # use elefren::entities::status::Status; + /// # use std::cell::RefCell; + /// # use elefren::prelude::*; + /// # fn main() -> Result<(), elefren::Error> { + /// # let data = Data { + /// # base: "".into(), + /// # client_id: "".into(), + /// # client_secret: "".into(), + /// # redirect: "".into(), + /// # token: "".into(), + /// # }; + /// struct HomeTimeline { + /// client: Mastodon, + /// page: RefCell>>, + /// } + /// let client = Mastodon::from(data); + /// let home = client.get_home_timeline()?.to_owned(); + /// let tl = HomeTimeline { + /// client, + /// page: RefCell::new(Some(home)), + /// }; + /// # Ok(()) + /// # } + /// ``` + pub fn to_owned(self) -> OwnedPage { + OwnedPage::from(self) + } + /// Returns an iterator that provides a stream of `T`s /// /// This abstracts away the process of iterating over each item in a page,