1pub mod models;
2
3use self::models::User;
4
5use async_trait::async_trait;
6use reqwest::Method;
7use std::collections::HashMap;
8
9#[async_trait]
10pub trait UserBuilder {
11 async fn new(self, client: &mut crate::Https) -> User;
12}
13
14#[async_trait]
15impl UserBuilder for &str {
16 async fn new(self, client: &mut crate::Https) -> User {
18 let mut map = HashMap::new();
19 map.insert("usernames", vec![self]);
20
21 let data = client
22 .post(&format!("{}/usernames/users", crate::USER))
23 .await
24 .json(&map)
25 .header("content-length", serde_json::to_vec(&map).unwrap().len())
26 .send()
27 .await
28 .expect("Failed to get user info")
29 .json::<serde_json::Value>()
30 .await
31 .expect("Failed to get user json");
32
33 if let Some(users) = data.get("data") {
34 if let Some(id) = users[0].get("id") {
35 let builder = id.as_i64().unwrap() as u64;
36 builder.new(client).await
37 } else {
38 panic!("Failed to find users with given name")
39 }
40 } else {
41 panic!("Request failed")
42 }
43 }
44}
45
46#[async_trait]
47impl UserBuilder for u64 {
48 async fn new(self, client: &mut crate::Https) -> User {
50 let user: User = client
51 .client
52 .request(Method::GET, &format!("{}/v1/users/{}", crate::USER, self))
53 .send()
54 .await
55 .expect("Failed to get user info from base")
56 .json()
57 .await
58 .expect("Failed to update struct with base");
59
60 let mut u2 = User {
61 id: Some(self),
62 username: user.username,
63 avatarfinal: user.avatarfinal,
64 avataruri: user.avataruri,
65 isonline: user.isonline,
66 ..client
67 .client
68 .request(Method::GET, &format!("{}/users/{}", crate::USER, self))
69 .send()
70 .await
71 .expect("Failed to get user info from user")
72 .json()
73 .await
74 .expect("Failed to update struct with user")
75 };
76
77 u2.client = Some(client.clone());
78 u2
79 }
80}
81
82impl User {
83 pub async fn friends(&mut self) -> Vec<User> {
85 if let Some(friends) = self.friends.clone() {
86 friends
87 } else {
88 let mut friends: Vec<User> = vec![];
89 let mut page: i32 = 1;
90 let mut page_string = format!("?page={}", page);
91
92 let mut data = self
93 .client
94 .as_mut()
95 .unwrap()
96 .client
97 .request(
98 Method::GET,
99 &format!(
100 "{}/v1/users/{}/friends{}",
101 crate::USER,
102 self.id.unwrap(),
103 page_string
104 ),
105 )
106 .send()
107 .await
108 .expect("Failed to get friends list")
109 .json::<Vec<User>>()
110 .await
111 .expect("Failed to get friends json");
112
113 loop {
114 friends.extend_from_slice(&data[..]);
115
116 page += 1;
117 page_string = format!("?page={}", page);
118 data = self
119 .client
120 .as_mut()
121 .unwrap()
122 .client
123 .request(
124 Method::GET,
125 &format!(
126 "{}/users/{}/friends{}",
127 crate::FRIENDS,
128 self.id.unwrap(),
129 page_string
130 ),
131 )
132 .send()
133 .await
134 .expect("Failed to get friends list")
135 .json::<Vec<User>>()
136 .await
137 .expect("Failed to get friends json");
138
139 if data.is_empty() {
140 break;
141 }
142 }
143
144 self.friends = Some(friends.clone());
145 friends
146 }
147 }
148
149 }