twitter_v2/api/
users.rs

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}