1use super::TwitterApi;
2use crate::api_result::ApiResult;
3use crate::authorization::Authorization;
4use crate::data::{Blocking, Following, Muting, User};
5use crate::id::IntoNumericId;
6use crate::meta::ResultCountMeta;
7use crate::query::{GetRelatedUsersRequestBuilder, GetUsersRequestBuilder, UrlQueryExt};
8use crate::requests::TargetUserId;
9use crate::utils::url;
10use reqwest::Method;
11
12impl<A> TwitterApi<A>
13where
14 A: Authorization,
15{
16 pub fn get_users(
17 &self,
18 ids: impl IntoIterator<Item = impl IntoNumericId>,
19 ) -> GetUsersRequestBuilder<A, Vec<User>, ()> {
20 let mut url = self.url("users").unwrap();
21 url.append_query_seq("ids", ids);
22 GetUsersRequestBuilder::new(self, url)
23 }
24 pub fn get_user(&self, id: impl IntoNumericId) -> GetUsersRequestBuilder<A, User, ()> {
25 GetUsersRequestBuilder::new(self, self.url(format!("users/{id}")).unwrap())
26 }
27 pub fn get_users_by_usernames(
28 &self,
29 usernames: impl IntoIterator<Item = impl ToString>,
30 ) -> GetUsersRequestBuilder<A, Vec<User>, ()> {
31 let mut url = self.url("users/by").unwrap();
32 url.append_query_seq("usernames", usernames);
33 GetUsersRequestBuilder::new(self, url)
34 }
35 pub fn get_user_by_username(
36 &self,
37 username: impl ToString,
38 ) -> GetUsersRequestBuilder<A, User, ()> {
39 GetUsersRequestBuilder::new(
40 self,
41 self.url(url!("users/by/username/{}", username)).unwrap(),
42 )
43 }
44 pub fn get_users_me(&self) -> GetUsersRequestBuilder<A, User, ()> {
45 GetUsersRequestBuilder::new(self, self.url("users/me").unwrap())
46 }
47 pub fn get_user_followers(
48 &self,
49 id: impl IntoNumericId,
50 ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
51 GetRelatedUsersRequestBuilder::new(self, self.url(format!("users/{id}/followers")).unwrap())
52 }
53 pub fn get_user_following(
54 &self,
55 id: impl IntoNumericId,
56 ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
57 GetRelatedUsersRequestBuilder::new(self, self.url(format!("users/{id}/following")).unwrap())
58 }
59 pub async fn post_user_following(
60 &self,
61 id: impl IntoNumericId,
62 target_user_id: impl IntoNumericId,
63 ) -> ApiResult<A, Following, ()> {
64 self.send(
65 self.request(Method::POST, self.url(format!("users/{id}/following"))?)
66 .json(&TargetUserId::from(target_user_id)),
67 )
68 .await
69 }
70 pub async fn delete_user_following(
71 &self,
72 source_user_id: impl IntoNumericId,
73 target_user_id: impl IntoNumericId,
74 ) -> ApiResult<A, Following, ()> {
75 self.send(self.request(
76 Method::DELETE,
77 self.url(format!("users/{source_user_id}/following/{target_user_id}"))?,
78 ))
79 .await
80 }
81 pub fn get_user_blocking(
82 &self,
83 id: impl IntoNumericId,
84 ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
85 GetRelatedUsersRequestBuilder::new(self, self.url(format!("users/{id}/blocking")).unwrap())
86 }
87 pub async fn post_user_blocking(
88 &self,
89 id: impl IntoNumericId,
90 target_user_id: impl IntoNumericId,
91 ) -> ApiResult<A, Blocking, ()> {
92 self.send(
93 self.request(Method::POST, self.url(format!("users/{id}/blocking"))?)
94 .json(&TargetUserId::from(target_user_id)),
95 )
96 .await
97 }
98 pub async fn delete_user_blocking(
99 &self,
100 source_user_id: impl IntoNumericId,
101 target_user_id: impl IntoNumericId,
102 ) -> ApiResult<A, Blocking, ()> {
103 self.send(self.request(
104 Method::DELETE,
105 self.url(format!("users/{source_user_id}/blocking/{target_user_id}"))?,
106 ))
107 .await
108 }
109 pub fn get_user_muting(
110 &self,
111 id: impl IntoNumericId,
112 ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
113 GetRelatedUsersRequestBuilder::new(self, self.url(format!("users/{id}/muting")).unwrap())
114 }
115 pub async fn post_user_muting(
116 &self,
117 id: impl IntoNumericId,
118 target_user_id: impl IntoNumericId,
119 ) -> ApiResult<A, Muting, ()> {
120 self.send(
121 self.request(Method::POST, self.url(format!("users/{id}/muting"))?)
122 .json(&TargetUserId::from(target_user_id)),
123 )
124 .await
125 }
126 pub async fn delete_user_muting(
127 &self,
128 source_user_id: impl IntoNumericId,
129 target_user_id: impl IntoNumericId,
130 ) -> ApiResult<A, Muting, ()> {
131 self.send(self.request(
132 Method::DELETE,
133 self.url(format!("users/{source_user_id}/muting/{target_user_id}"))?,
134 ))
135 .await
136 }
137}