1use super::TwitterApi;
2use crate::api_result::ApiResult;
3use crate::authorization::Authorization;
4use crate::data::{Blocking, Following, List, Muting, Pinned, Space, Tweet, User};
5use crate::error::Result;
6use crate::id::{IntoNumericId, NumericId};
7use crate::meta::{ResultCountMeta, SimpleResultCountMeta, TweetsMeta};
8use crate::query::{
9 GetPaginatedListsRequestBuilder, GetRelatedUsersRequestBuilder, GetSpacesRequestBuilder,
10 GetTimelineRequestBuilder,
11};
12
13pub struct TwitterApiWithUserCtx<A> {
14 user_id: NumericId,
15 client: TwitterApi<A>,
16}
17
18impl<A> TwitterApi<A>
19where
20 A: Authorization,
21{
22 pub async fn with_user_ctx(&self) -> Result<TwitterApiWithUserCtx<A>> {
23 let user_id = self.get_users_me().send().await?.into_data().unwrap().id;
24 Ok(TwitterApiWithUserCtx {
25 user_id,
26 client: self.clone(),
27 })
28 }
29}
30
31impl<A> TwitterApiWithUserCtx<A>
32where
33 A: Authorization,
34{
35 pub fn get_my_owned_lists(
36 &self,
37 ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
38 self.client.get_user_owned_lists(self.user_id)
39 }
40 pub fn get_my_list_memberships(
41 &self,
42 ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
43 self.client.get_user_list_memberships(self.user_id)
44 }
45 pub fn get_my_followed_lists(
46 &self,
47 ) -> GetPaginatedListsRequestBuilder<A, Vec<List>, ResultCountMeta> {
48 self.client.get_user_followed_lists(self.user_id)
49 }
50 pub async fn post_my_followed_list(
51 &self,
52 list_id: impl IntoNumericId,
53 ) -> ApiResult<A, Following, ()> {
54 self.client
55 .post_user_followed_list(self.user_id, list_id)
56 .await
57 }
58 pub async fn delete_my_followed_list(
59 &self,
60 list_id: impl IntoNumericId,
61 ) -> ApiResult<A, Following, ()> {
62 self.client
63 .delete_user_followed_list(self.user_id, list_id)
64 .await
65 }
66 pub async fn post_my_pinned_list(
67 &self,
68 list_id: impl IntoNumericId,
69 ) -> ApiResult<A, Pinned, ()> {
70 self.client
71 .post_user_pinned_list(self.user_id, list_id)
72 .await
73 }
74 pub async fn delete_my_pinned_list(
75 &self,
76 list_id: impl IntoNumericId,
77 ) -> ApiResult<A, Pinned, ()> {
78 self.client
79 .delete_user_pinned_list(self.user_id, list_id)
80 .await
81 }
82 pub fn get_my_spaces(&self) -> GetSpacesRequestBuilder<A, Vec<Space>, SimpleResultCountMeta> {
83 self.client.get_spaces_by_creator_ids([self.user_id])
84 }
85 pub fn get_my_tweets(&self) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
86 self.client.get_user_tweets(self.user_id)
87 }
88 pub fn get_my_mentions(&self) -> GetTimelineRequestBuilder<A, Vec<Tweet>, TweetsMeta> {
89 self.client.get_user_tweets(self.user_id)
90 }
91 pub fn get_my_followers(&self) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
92 self.client.get_user_followers(self.user_id)
93 }
94 pub fn get_my_following(&self) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
95 self.client.get_user_following(self.user_id)
96 }
97 pub async fn post_my_following(
98 &self,
99 target_user_id: impl IntoNumericId,
100 ) -> ApiResult<A, Following, ()> {
101 self.client
102 .post_user_following(self.user_id, target_user_id)
103 .await
104 }
105 pub async fn delete_my_following(
106 &self,
107 target_user_id: impl IntoNumericId,
108 ) -> ApiResult<A, Following, ()> {
109 self.client
110 .delete_user_following(self.user_id, target_user_id)
111 .await
112 }
113 pub fn get_my_blocking(&self) -> GetRelatedUsersRequestBuilder<A, Vec<User>, ResultCountMeta> {
114 self.client.get_user_blocking(self.user_id)
115 }
116 pub async fn post_my_blocking(
117 &self,
118 target_user_id: impl IntoNumericId,
119 ) -> ApiResult<A, Blocking, ()> {
120 self.client
121 .post_user_blocking(self.user_id, target_user_id)
122 .await
123 }
124 pub async fn delete_my_blocking(
125 &self,
126 target_user_id: impl IntoNumericId,
127 ) -> ApiResult<A, Blocking, ()> {
128 self.client
129 .delete_user_blocking(self.user_id, target_user_id)
130 .await
131 }
132 pub async fn post_my_muting(
133 &self,
134 target_user_id: impl IntoNumericId,
135 ) -> ApiResult<A, Muting, ()> {
136 self.client
137 .post_user_muting(self.user_id, target_user_id)
138 .await
139 }
140 pub async fn delete_my_muting(
141 &self,
142 target_user_id: impl IntoNumericId,
143 ) -> ApiResult<A, Muting, ()> {
144 self.client
145 .delete_user_muting(self.user_id, target_user_id)
146 .await
147 }
148}