1use serde::{Deserialize, Serialize};
2
3use super::common::{
4 ChildrenData, GifAttachment, HideStatus, MediaType, PollAttachment, PollResult, PostOwner,
5 ReplyAudience, ReplyControl, TextAttachment, TextEntitiesResponse, TextEntity,
6};
7use super::ids::{ContainerId, PostId};
8use super::location::Location;
9use super::pagination::Paging;
10use super::time::ThreadsTime;
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct Post {
15 pub id: PostId,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub text: Option<String>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub media_type: Option<MediaType>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub media_url: Option<String>,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub permalink: Option<String>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub timestamp: Option<ThreadsTime>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub username: Option<String>,
35 #[serde(default, skip_serializing_if = "Option::is_none")]
37 pub owner: Option<PostOwner>,
38 #[serde(default)]
40 pub is_reply: bool,
41 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub media_product_type: Option<String>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
46 pub shortcode: Option<String>,
47 #[serde(default, skip_serializing_if = "Option::is_none")]
49 pub thumbnail_url: Option<String>,
50 #[serde(default, skip_serializing_if = "Option::is_none")]
52 pub alt_text: Option<String>,
53 #[serde(default, skip_serializing_if = "Option::is_none")]
55 pub children: Option<ChildrenData>,
56 #[serde(default)]
58 pub is_quote_post: bool,
59 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub link_attachment_url: Option<String>,
62 #[serde(default)]
64 pub has_replies: bool,
65 #[serde(default, skip_serializing_if = "Option::is_none")]
67 pub reply_audience: Option<ReplyAudience>,
68 #[serde(default, skip_serializing_if = "Option::is_none")]
70 pub quoted_post: Option<Box<Post>>,
71 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub reposted_post: Option<Box<Post>>,
74 #[serde(default, skip_serializing_if = "Option::is_none")]
76 pub gif_url: Option<String>,
77 #[serde(default, skip_serializing_if = "Option::is_none")]
79 pub poll_attachment: Option<PollResult>,
80 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub root_post: Option<Box<Post>>,
83 #[serde(default, skip_serializing_if = "Option::is_none")]
85 pub replied_to: Option<Box<Post>>,
86 #[serde(default)]
88 pub is_reply_owned_by_me: bool,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub hide_status: Option<HideStatus>,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
94 pub topic_tag: Option<String>,
95 #[serde(default, skip_serializing_if = "Option::is_none")]
97 pub ghost_post_status: Option<String>,
98 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub ghost_post_expiration_timestamp: Option<ThreadsTime>,
101 #[serde(default)]
103 pub is_verified: bool,
104 #[serde(default, skip_serializing_if = "Option::is_none")]
106 pub profile_picture_url: Option<String>,
107 #[serde(default, skip_serializing_if = "Option::is_none")]
109 pub reply_approval_status: Option<String>,
110 #[serde(default)]
112 pub is_spoiler_media: bool,
113 #[serde(default, skip_serializing_if = "Option::is_none")]
115 pub text_entities: Option<TextEntitiesResponse>,
116 #[serde(default, skip_serializing_if = "Option::is_none")]
118 pub text_attachment: Option<TextAttachment>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
121 pub allowlisted_country_codes: Option<Vec<String>>,
122 #[serde(default, skip_serializing_if = "Option::is_none")]
124 pub location_id: Option<String>,
125 #[serde(default, skip_serializing_if = "Option::is_none")]
127 pub location: Option<Location>,
128}
129
130#[derive(Debug, Clone, Serialize, Deserialize)]
132pub struct PostContent {
133 #[serde(default, skip_serializing_if = "Option::is_none")]
135 pub text: Option<String>,
136 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub media_type: Option<String>,
139 #[serde(default, skip_serializing_if = "Option::is_none")]
141 pub reply_to_id: Option<PostId>,
142}
143
144#[derive(Debug, Clone, Serialize, Deserialize)]
146pub struct TextPostContent {
147 pub text: String,
149 #[serde(default, skip_serializing_if = "Option::is_none")]
151 pub link_attachment: Option<String>,
152 #[serde(default, skip_serializing_if = "Option::is_none")]
154 pub poll_attachment: Option<PollAttachment>,
155 #[serde(default, skip_serializing_if = "Option::is_none")]
157 pub reply_control: Option<ReplyControl>,
158 #[serde(default, skip_serializing_if = "Option::is_none")]
160 pub reply_to_id: Option<PostId>,
161 #[serde(default, skip_serializing_if = "Option::is_none")]
163 pub topic_tag: Option<String>,
164 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub allowlisted_country_codes: Option<Vec<String>>,
167 #[serde(default, skip_serializing_if = "Option::is_none")]
169 pub location_id: Option<String>,
170 #[serde(default)]
172 pub auto_publish_text: bool,
173 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub quoted_post_id: Option<PostId>,
176 #[serde(default, skip_serializing_if = "Option::is_none")]
178 pub text_entities: Option<Vec<TextEntity>>,
179 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub text_attachment: Option<TextAttachment>,
182 #[serde(default, skip_serializing_if = "Option::is_none")]
184 pub gif_attachment: Option<GifAttachment>,
185 #[serde(default)]
187 pub is_ghost_post: bool,
188 #[serde(default)]
190 pub enable_reply_approvals: bool,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct ImagePostContent {
196 #[serde(default, skip_serializing_if = "Option::is_none")]
198 pub text: Option<String>,
199 pub image_url: String,
201 #[serde(default, skip_serializing_if = "Option::is_none")]
203 pub alt_text: Option<String>,
204 #[serde(default, skip_serializing_if = "Option::is_none")]
206 pub reply_control: Option<ReplyControl>,
207 #[serde(default, skip_serializing_if = "Option::is_none")]
209 pub reply_to_id: Option<PostId>,
210 #[serde(default, skip_serializing_if = "Option::is_none")]
212 pub topic_tag: Option<String>,
213 #[serde(default, skip_serializing_if = "Option::is_none")]
215 pub allowlisted_country_codes: Option<Vec<String>>,
216 #[serde(default, skip_serializing_if = "Option::is_none")]
218 pub location_id: Option<String>,
219 #[serde(default, skip_serializing_if = "Option::is_none")]
221 pub quoted_post_id: Option<PostId>,
222 #[serde(default, skip_serializing_if = "Option::is_none")]
224 pub text_entities: Option<Vec<TextEntity>>,
225 #[serde(default)]
227 pub is_spoiler_media: bool,
228 #[serde(default)]
230 pub enable_reply_approvals: bool,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct VideoPostContent {
236 #[serde(default, skip_serializing_if = "Option::is_none")]
238 pub text: Option<String>,
239 pub video_url: String,
241 #[serde(default, skip_serializing_if = "Option::is_none")]
243 pub alt_text: Option<String>,
244 #[serde(default, skip_serializing_if = "Option::is_none")]
246 pub reply_control: Option<ReplyControl>,
247 #[serde(default, skip_serializing_if = "Option::is_none")]
249 pub reply_to_id: Option<PostId>,
250 #[serde(default, skip_serializing_if = "Option::is_none")]
252 pub topic_tag: Option<String>,
253 #[serde(default, skip_serializing_if = "Option::is_none")]
255 pub allowlisted_country_codes: Option<Vec<String>>,
256 #[serde(default, skip_serializing_if = "Option::is_none")]
258 pub location_id: Option<String>,
259 #[serde(default, skip_serializing_if = "Option::is_none")]
261 pub quoted_post_id: Option<PostId>,
262 #[serde(default, skip_serializing_if = "Option::is_none")]
264 pub text_entities: Option<Vec<TextEntity>>,
265 #[serde(default)]
267 pub is_spoiler_media: bool,
268 #[serde(default)]
270 pub enable_reply_approvals: bool,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
275pub struct CarouselPostContent {
276 #[serde(default, skip_serializing_if = "Option::is_none")]
278 pub text: Option<String>,
279 pub children: Vec<ContainerId>,
281 #[serde(default, skip_serializing_if = "Option::is_none")]
283 pub reply_control: Option<ReplyControl>,
284 #[serde(default, skip_serializing_if = "Option::is_none")]
286 pub reply_to_id: Option<PostId>,
287 #[serde(default, skip_serializing_if = "Option::is_none")]
289 pub topic_tag: Option<String>,
290 #[serde(default, skip_serializing_if = "Option::is_none")]
292 pub allowlisted_country_codes: Option<Vec<String>>,
293 #[serde(default, skip_serializing_if = "Option::is_none")]
295 pub location_id: Option<String>,
296 #[serde(default, skip_serializing_if = "Option::is_none")]
298 pub quoted_post_id: Option<PostId>,
299 #[serde(default, skip_serializing_if = "Option::is_none")]
301 pub text_entities: Option<Vec<TextEntity>>,
302 #[serde(default)]
304 pub is_spoiler_media: bool,
305 #[serde(default)]
307 pub enable_reply_approvals: bool,
308}
309
310#[derive(Debug, Clone, Serialize, Deserialize)]
312pub struct PostsResponse {
313 pub data: Vec<Post>,
315 #[serde(default)]
317 pub paging: Paging,
318}
319
320#[derive(Debug, Clone, Serialize, Deserialize)]
322pub struct RepliesResponse {
323 pub data: Vec<Post>,
325 #[serde(default)]
327 pub paging: Paging,
328}
329
330#[derive(Debug, Clone, Serialize, Deserialize)]
332pub struct InsightsResponse {
333 pub data: Vec<super::insights::Insight>,
335}