Skip to main content

snoo/items/
user.rs

1use crate::models::UserInfo;
2use crate::{endpoints, reddit::Reddit};
3
4use crate::items::{post::Post, submission::Comment, AbstractedApi};
5
6use std::io;
7
8/// Weak link to the user.
9// Dosent perform any http request when created.
10// calling .get will fetch the data
11pub struct RedditUserLink<'r> {
12    reddit: &'r Reddit,
13    username: String,
14}
15
16impl<'r> RedditUserLink<'r> {
17    pub fn new(reddit: &'r Reddit, name: &str) -> RedditUserLink<'r> {
18        RedditUserLink {
19            reddit: reddit,
20            username: name.to_owned(),
21        }
22    }
23
24    pub async fn submitted(&self) -> io::Result<Vec<Post<'r>>> {
25        let ep = self
26            .reddit
27            .ep(endpoints::USER_SUBMITTED.user(&self.username))?;
28        Ok(Post::list_of(self.reddit, &self.reddit.get_list(ep).await?))
29    }
30
31    pub async fn comments(&self) -> io::Result<Vec<Comment<'r>>> {
32        let ep = self
33            .reddit
34            .ep(endpoints::USER_COMMENTS.user(&self.username))?;
35        Ok(Comment::list_of(
36            self.reddit,
37            &self.reddit.get_list(ep).await?,
38        ))
39    }
40
41    pub async fn get(self) -> io::Result<RedditUser<'r>> {
42        let ep = self.reddit.ep(endpoints::USER_ABOUT.user(&self.username))?;
43        let about = self.reddit.get_data::<UserInfo>(ep).await?;
44
45        Ok(RedditUser {
46            link: self,
47            info: about.data,
48        })
49    }
50}
51
52/// Full user infomation
53pub struct RedditUser<'r> {
54    link: RedditUserLink<'r>,
55    info: UserInfo,
56}
57
58impl RedditUser<'_> {
59    pub fn name(&self) -> &str {
60        self.info.name.as_ref()
61    }
62
63    pub fn info(&self) -> &UserInfo {
64        &self.info
65    }
66
67    pub fn is_moderator(&self) -> bool {
68        self.info.is_mod
69    }
70
71    pub fn is_verified(&self) -> bool {
72        self.info.verified
73    }
74
75    pub fn is_employee(&self) -> bool {
76        self.info.is_employee
77    }
78
79    pub fn has_gold(&self) -> bool {
80        self.info.is_gold
81    }
82
83    pub async fn submitted(&'_ self) -> io::Result<Vec<Post<'_>>> {
84        self.link.submitted().await
85    }
86
87    pub async fn comments(&'_ self) -> io::Result<Vec<Comment<'_>>> {
88        self.link.comments().await
89    }
90}
91
92impl<'r> AbstractedApi<'r> for RedditUser<'r> {
93    type ApiType = UserInfo;
94    type AbstractedType = RedditUser<'r>;
95
96    fn from_parent(reddit: &'r Reddit, info: Self::ApiType) -> RedditUser<'r> {
97        RedditUser {
98            link: RedditUserLink::new(reddit, &info.name),
99            info,
100        }
101    }
102}