twapi_v2/responses/
tweets.rs1use crate::responses::{
2 attachments::Attachments, context_annotations::ContextAnnotations, edit_controls::EditControls,
3 entities::Entities, geo::Geo, media_metadata::MediaMetadata,
4 non_public_metrics::NonPublicMetrics, note_tweet::NoteTweet, organic_metrics::OrganicMetrics,
5 promoted_metrics::PromotedMetrics, public_metrics::PublicMetrics,
6 referenced_tweets::ReferencedTweets, scopes::Scopes, withheld::Withheld,
7};
8use chrono::prelude::*;
9use serde::{Deserialize, Serialize};
10
11#[derive(Serialize, Deserialize, Debug, Clone, Default)]
12pub struct Tweets {
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub attachments: Option<Attachments>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub author_id: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub card_uri: Option<String>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub community_id: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub context_annotations: Option<Vec<ContextAnnotations>>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub conversation_id: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub created_at: Option<DateTime<Utc>>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub display_text_range: Option<Vec<i64>>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub edit_controls: Option<EditControls>,
31 pub edit_history_tweet_ids: Vec<String>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub entities: Option<Entities>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub geo: Option<Geo>,
36 pub id: String,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub in_reply_to_user_id: Option<String>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 pub lang: Option<String>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub media_metadata: Option<Vec<MediaMetadata>>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub non_public_metrics: Option<NonPublicMetrics>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub note_tweet: Option<NoteTweet>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub organic_metrics: Option<OrganicMetrics>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub possibly_sensitive: Option<bool>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub promoted_metrics: Option<PromotedMetrics>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub public_metrics: Option<PublicMetrics>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub referenced_tweets: Option<Vec<ReferencedTweets>>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub reply_settings: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub scopes: Option<Scopes>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub source: Option<String>,
63 pub text: String,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub username: Option<String>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub withheld: Option<Withheld>,
68 #[serde(flatten)]
69 pub extra: std::collections::HashMap<String, serde_json::Value>,
70}
71
72impl Tweets {
73 pub fn is_empty_extra(&self) -> bool {
74 let res = self.extra.is_empty()
75 && self
76 .attachments
77 .as_ref()
78 .map(|it| it.is_empty_extra())
79 .unwrap_or(true)
80 && self
81 .context_annotations
82 .as_ref()
83 .map(|it| it.iter().all(|item| item.is_empty_extra()))
84 .unwrap_or(true)
85 && self
86 .edit_controls
87 .as_ref()
88 .map(|it| it.is_empty_extra())
89 .unwrap_or(true)
90 && self
91 .entities
92 .as_ref()
93 .map(|it| it.is_empty_extra())
94 .unwrap_or(true)
95 && self
96 .geo
97 .as_ref()
98 .map(|it| it.is_empty_extra())
99 .unwrap_or(true)
100 && self
101 .media_metadata
102 .as_ref()
103 .map(|it| it.iter().all(|item| item.is_empty_extra()))
104 .unwrap_or(true)
105 && self
106 .non_public_metrics
107 .as_ref()
108 .map(|it| it.is_empty_extra())
109 .unwrap_or(true)
110 && self
111 .note_tweet
112 .as_ref()
113 .map(|it| it.is_empty_extra())
114 .unwrap_or(true)
115 && self
116 .organic_metrics
117 .as_ref()
118 .map(|it| it.is_empty_extra())
119 .unwrap_or(true)
120 && self
121 .promoted_metrics
122 .as_ref()
123 .map(|it| it.is_empty_extra())
124 .unwrap_or(true)
125 && self
126 .public_metrics
127 .as_ref()
128 .map(|it| it.is_empty_extra())
129 .unwrap_or(true)
130 && self
131 .referenced_tweets
132 .as_ref()
133 .map(|it| it.iter().all(|item| item.is_empty_extra()))
134 .unwrap_or(true)
135 && self
136 .scopes
137 .as_ref()
138 .map(|it| it.is_empty_extra())
139 .unwrap_or(true)
140 && self
141 .withheld
142 .as_ref()
143 .map(|it| it.is_empty_extra())
144 .unwrap_or(true);
145 if !res {
146 println!("Tweets {:?}", self.extra);
147 }
148 res
149 }
150}