1use crate::api::error::TweetyError;
2use crate::{api::client::TweetyClient, types::types::ResponseWithHeaders};
3use reqwest::Method;
4use serde::{Deserialize, Serialize};
5use serde_qs::to_string as convert_query_to_string;
6
7#[derive(Debug, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub struct QueryParams {
10 pub end_time: Option<String>, pub expansions: Option<Vec<ExpansionType>>, pub max_results: Option<u32>, pub media_fields: Option<Vec<MediaField>>, pub pagination_token: Option<String>, pub place_fields: Option<Vec<PlaceField>>, pub poll_fields: Option<Vec<PollField>>, pub since_id: Option<String>, pub start_time: Option<String>, pub tweet_fields: Option<Vec<TweetField>>, pub until_id: Option<String>, pub user_fields: Option<Vec<UserField>>, }
23
24#[derive(Debug, Serialize, Deserialize)]
26#[serde(rename_all = "snake_case")]
27pub enum ExpansionType {
28 AttachmentsPollIds,
29 AttachmentsMediaKeys,
30 AuthorId,
31 EditHistoryTweetIds,
32 EntitiesMentionsUsername,
33 GeoPlaceId,
34 InReplyToUserId,
35 ReferencedTweetsId,
36 ReferencedTweetsIdAuthorId,
37}
38
39#[derive(Debug, Serialize, Deserialize)]
41#[serde(rename_all = "snake_case")]
42pub enum MediaField {
43 DurationMs,
44 Height,
45 MediaKey,
46 PreviewImageUrl,
47 Type,
48 Url,
49 Width,
50 PublicMetrics,
51 NonPublicMetrics,
52 OrganicMetrics,
53 PromotedMetrics,
54 AltText,
55 Variants,
56}
57
58#[derive(Debug, Serialize, Deserialize)]
60#[serde(rename_all = "snake_case")]
61pub enum PlaceField {
62 ContainedWithin,
63 Country,
64 CountryCode,
65 FullName,
66 Geo,
67 Id,
68 Name,
69 PlaceType,
70}
71
72#[derive(Debug, Serialize, Deserialize)]
74#[serde(rename_all = "snake_case")]
75pub enum PollField {
76 DurationMinutes,
77 EndDatetime,
78 Id,
79 Options,
80 VotingStatus,
81}
82
83#[derive(Debug, Serialize, Deserialize)]
85#[serde(rename_all = "snake_case")]
86pub enum TweetField {
87 Attachments,
88 AuthorId,
89 ContextAnnotations,
90 ConversationId,
91 CreatedAt,
92 EditControls,
93 Entities,
94 Geo,
95 Id,
96 InReplyToUserId,
97 Lang,
98 NonPublicMetrics,
99 PublicMetrics,
100 OrganicMetrics,
101 PromotedMetrics,
102 PossiblySensitive,
103 ReferencedTweets,
104 ReplySettings,
105 Source,
106 Text,
107 Withheld,
108}
109
110#[derive(Debug, Serialize, Deserialize)]
112#[serde(rename_all = "snake_case")]
113pub enum UserField {
114 CreatedAt,
115 Description,
116 Entities,
117 Id,
118 Location,
119 MostRecentTweetId,
120 Name,
121 PinnedTweetId,
122 ProfileImageUrl,
123 Protected,
124 PublicMetrics,
125 Url,
126 Username,
127 Verified,
128 VerifiedType,
129 Withheld,
130}
131
132#[derive(Debug, Serialize, Deserialize)]
134pub struct MentionsResponse {
135 pub data: Vec<TweetData>, pub includes: Option<Includes>, pub meta: MetaData, }
139
140#[derive(Debug, Serialize, Deserialize)]
142pub struct TweetData {
143 pub author_id: String, pub text: String, pub lang: String, pub conversation_id: String, pub edit_history_tweet_ids: Vec<String>, pub id: String, }
150
151#[derive(Debug, Serialize, Deserialize)]
153pub struct Includes {
154 pub users: Vec<UserData>, }
156
157#[derive(Debug, Serialize, Deserialize)]
159pub struct UserData {
160 pub name: String, pub id: String, pub entities: Option<UserEntities>, pub username: String, pub created_at: Option<String>, }
166
167#[derive(Debug, Serialize, Deserialize)]
169pub struct UserEntities {
170 pub url: Option<UrlEntity>, pub description: Option<DescriptionEntity>, }
173
174#[derive(Debug, Serialize, Deserialize)]
176pub struct UrlEntity {
177 pub urls: Vec<UrlDetail>, }
179
180#[derive(Debug, Serialize, Deserialize)]
182pub struct UrlDetail {
183 pub start: u32, pub end: u32, pub url: String, pub expanded_url: String, pub display_url: String, }
189
190#[derive(Debug, Serialize, Deserialize)]
192pub struct DescriptionEntity {
193 pub urls: Option<Vec<UrlDetail>>, pub hashtags: Option<Vec<Hashtag>>, pub mentions: Option<Vec<Mention>>, pub cashtags: Option<Vec<Cashtag>>, }
198
199#[derive(Debug, Serialize, Deserialize)]
201pub struct Hashtag {
202 pub start: u32, pub end: u32, pub tag: String, }
206
207#[derive(Debug, Serialize, Deserialize)]
209pub struct Mention {
210 pub start: u32, pub end: u32, pub username: String, }
214
215#[derive(Debug, Serialize, Deserialize)]
217pub struct Cashtag {
218 pub start: u32, pub end: u32, pub tag: String, }
222
223#[derive(Debug, Serialize, Deserialize)]
225pub struct MetaData {
226 pub oldest_id: String, pub newest_id: String, pub result_count: u32, pub next_token: Option<String>, }
231
232impl TweetyClient {
233 pub async fn get_users_mentions(
240 &self,
241 user_id: &str,
242 query_params: Option<QueryParams>,
243 ) -> Result<ResponseWithHeaders, TweetyError> {
244 let mut base_url = format!("https://api.x.com/2/users/{}/mentions", user_id);
245 if let Some(queries) = query_params {
246 let query_params = convert_query_to_string(&queries).unwrap();
247 base_url = format!("{}?{}", base_url, query_params);
248 }
249 match self.send_request::<()>(&base_url, Method::GET, None).await {
250 Ok(value) => Ok(value),
251 Err(err) => Err(TweetyError::ApiError(err.to_string())),
252 }
253 }
254}