twitter_v2/api/
lists.rs

1use super::TwitterApi;
2use crate::api_result::ApiResult;
3use crate::authorization::Authorization;
4use crate::data::{Deleted, Following, IsMember, List, Pinned, Tweet, Updated, User};
5use crate::id::IntoNumericId;
6use crate::meta::ResultCountMeta;
7use crate::query::{
8    GetLimitedRelatedTweetsRequestBuilder, GetListsRequestBuilder, GetPaginatedListsRequestBuilder,
9    GetRelatedUsersRequestBuilder,
10};
11use crate::requests::{ListBuilder, ListId, UserId};
12use reqwest::Method;
13
14impl<A> TwitterApi<A>
15where
16    A: Authorization,
17{
18    pub fn get_list(&self, id: impl IntoNumericId) -> GetListsRequestBuilder<A, List, ()> {
19        GetListsRequestBuilder::new(self, self.url(format!("lists/{id}")).unwrap())
20    }
21    pub fn get_user_owned_lists(
22        &self,
23        id: impl IntoNumericId,
24    ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
25        GetPaginatedListsRequestBuilder::new(
26            self,
27            self.url(format!("users/{id}/owned_lists")).unwrap(),
28        )
29    }
30    pub fn post_list(&self, name: impl ToString) -> ListBuilder<A, List> {
31        let mut builder = ListBuilder::new(self, self.url("lists").unwrap(), Method::POST);
32        builder.name(name);
33        builder
34    }
35    pub fn put_list(&self, id: impl IntoNumericId) -> ListBuilder<A, Updated> {
36        ListBuilder::new(self, self.url(format!("lists/{id}")).unwrap(), Method::PUT)
37    }
38    pub async fn delete_list(&self, id: impl IntoNumericId) -> ApiResult<A, Deleted, ()> {
39        self.send(self.request(Method::DELETE, self.url(format!("lists/{id}"))?))
40            .await
41    }
42    pub fn get_list_tweets(
43        &self,
44        id: impl IntoNumericId,
45    ) -> GetLimitedRelatedTweetsRequestBuilder<A, Vec<Tweet>, ResultCountMeta> {
46        GetLimitedRelatedTweetsRequestBuilder::new(
47            self,
48            self.url(format!("lists/{id}/tweets")).unwrap(),
49        )
50    }
51    pub fn get_user_list_memberships(
52        &self,
53        id: impl IntoNumericId,
54    ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
55        GetPaginatedListsRequestBuilder::new(
56            self,
57            self.url(format!("users/{id}/list_memberships")).unwrap(),
58        )
59    }
60    pub fn get_list_members(
61        &self,
62        id: impl IntoNumericId,
63    ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
64        GetRelatedUsersRequestBuilder::new(self, self.url(format!("lists/{id}/members")).unwrap())
65    }
66    pub async fn post_list_member(
67        &self,
68        id: impl IntoNumericId,
69        user_id: impl IntoNumericId,
70    ) -> ApiResult<A, IsMember, ()> {
71        self.send(
72            self.request(Method::POST, self.url(format!("lists/{id}/members"))?)
73                .json(&UserId::from(user_id)),
74        )
75        .await
76    }
77    pub async fn delete_list_member(
78        &self,
79        id: impl IntoNumericId,
80        user_id: impl IntoNumericId,
81    ) -> ApiResult<A, IsMember, ()> {
82        self.send(self.request(
83            Method::DELETE,
84            self.url(format!("lists/{id}/members/{user_id}"))?,
85        ))
86        .await
87    }
88    pub fn get_list_followers(
89        &self,
90        id: impl IntoNumericId,
91    ) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
92        GetRelatedUsersRequestBuilder::new(self, self.url(format!("lists/{id}/followers")).unwrap())
93    }
94    pub fn get_user_followed_lists(
95        &self,
96        id: impl IntoNumericId,
97    ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
98        GetPaginatedListsRequestBuilder::new(
99            self,
100            self.url(format!("users/{id}/followed_lists")).unwrap(),
101        )
102    }
103    pub async fn post_user_followed_list(
104        &self,
105        id: impl IntoNumericId,
106        list_id: impl IntoNumericId,
107    ) -> ApiResult<A, Following, ()> {
108        self.send(
109            self.request(
110                Method::POST,
111                self.url(format!("users/{id}/followed_lists"))?,
112            )
113            .json(&ListId::from(list_id)),
114        )
115        .await
116    }
117    pub async fn delete_user_followed_list(
118        &self,
119        id: impl IntoNumericId,
120        list_id: impl IntoNumericId,
121    ) -> ApiResult<A, Following, ()> {
122        self.send(self.request(
123            Method::DELETE,
124            self.url(format!("users/{id}/followed_lists/{list_id}"))?,
125        ))
126        .await
127    }
128    pub fn get_user_pinned_lists(
129        &self,
130        id: impl IntoNumericId,
131    ) -> GetListsRequestBuilder<A, Vec<List>, ()> {
132        GetListsRequestBuilder::new(self, self.url(format!("users/{id}/lists")).unwrap())
133    }
134    pub async fn post_user_pinned_list(
135        &self,
136        id: impl IntoNumericId,
137        list_id: impl IntoNumericId,
138    ) -> ApiResult<A, Pinned, ()> {
139        self.send(
140            self.request(Method::POST, self.url(format!("users/{id}/pinned_lists"))?)
141                .json(&ListId::from(list_id)),
142        )
143        .await
144    }
145    pub async fn delete_user_pinned_list(
146        &self,
147        id: impl IntoNumericId,
148        list_id: impl IntoNumericId,
149    ) -> ApiResult<A, Pinned, ()> {
150        self.send(self.request(
151            Method::DELETE,
152            self.url(format!("users/{id}/pinned_lists/{list_id}"))?,
153        ))
154        .await
155    }
156}