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}