1use crate::models::UserInfo;
2use crate::{endpoints, reddit::Reddit};
3
4use crate::items::{post::Post, submission::Comment, AbstractedApi};
5
6use std::io;
7
8pub 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
52pub 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}