Documentation
use crate::items::{
    submission::Submission, subreddit::SubredditLink, user::RedditUserLink, AbstractedApi,
};
use crate::models::PostInfo;
use crate::reddit::Reddit;

use std::io;

pub struct Post<'r> {
    reddit: &'r Reddit,
    info: PostInfo,
}

impl<'r> AbstractedApi<'r> for Post<'r> {
    type ApiType = PostInfo;
    type AbstractedType = Post<'r>;

    fn from_parent(parent: &'r Reddit, info: Self::ApiType) -> Self {
        Self {
            reddit: parent,
            info: info,
        }
    }
}

impl Post<'_> {
    pub fn info(&self) -> &PostInfo {
        &self.info
    }

    pub fn url(&self) -> &str {
        self.info.url.as_ref()
    }

    pub fn subreddit(&'_ self) -> SubredditLink {
        self.reddit.subreddit(&self.info.subreddit)
    }

    pub fn author(&self) -> RedditUserLink {
        RedditUserLink::new(self.reddit, &self.info.author)
    }

    pub async fn submission(&'_ self) -> io::Result<Submission<'_>> {
        self.reddit.submission_from_link(&self.url()).await
    }
}