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, PartialEq)]
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 #[serde(skip_serializing_if = "Option::is_none")]
32 pub edit_history_tweet_ids: Option<Vec<String>>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub entities: Option<Entities>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 pub geo: Option<Geo>,
37 pub id: String,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub in_reply_to_user_id: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub lang: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub media_metadata: Option<Vec<MediaMetadata>>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 pub non_public_metrics: Option<NonPublicMetrics>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 pub note_tweet: Option<NoteTweet>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub organic_metrics: Option<OrganicMetrics>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub possibly_sensitive: Option<bool>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub promoted_metrics: Option<PromotedMetrics>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub public_metrics: Option<PublicMetrics>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub referenced_tweets: Option<Vec<ReferencedTweets>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub reply_settings: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub scopes: Option<Scopes>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub source: Option<String>,
64 pub text: String,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub username: Option<String>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub withheld: Option<Withheld>,
69 #[serde(flatten)]
70 pub extra: std::collections::HashMap<String, serde_json::Value>,
71}
72
73impl Tweets {
74 pub fn is_empty_extra(&self) -> bool {
75 let res = self.extra.is_empty()
76 && self
77 .attachments
78 .as_ref()
79 .map(|it| it.is_empty_extra())
80 .unwrap_or(true)
81 && self
82 .context_annotations
83 .as_ref()
84 .map(|it| it.iter().all(|item| item.is_empty_extra()))
85 .unwrap_or(true)
86 && self
87 .edit_controls
88 .as_ref()
89 .map(|it| it.is_empty_extra())
90 .unwrap_or(true)
91 && self
92 .entities
93 .as_ref()
94 .map(|it| it.is_empty_extra())
95 .unwrap_or(true)
96 && self
97 .geo
98 .as_ref()
99 .map(|it| it.is_empty_extra())
100 .unwrap_or(true)
101 && self
102 .media_metadata
103 .as_ref()
104 .map(|it| it.iter().all(|item| item.is_empty_extra()))
105 .unwrap_or(true)
106 && self
107 .non_public_metrics
108 .as_ref()
109 .map(|it| it.is_empty_extra())
110 .unwrap_or(true)
111 && self
112 .note_tweet
113 .as_ref()
114 .map(|it| it.is_empty_extra())
115 .unwrap_or(true)
116 && self
117 .organic_metrics
118 .as_ref()
119 .map(|it| it.is_empty_extra())
120 .unwrap_or(true)
121 && self
122 .promoted_metrics
123 .as_ref()
124 .map(|it| it.is_empty_extra())
125 .unwrap_or(true)
126 && self
127 .public_metrics
128 .as_ref()
129 .map(|it| it.is_empty_extra())
130 .unwrap_or(true)
131 && self
132 .referenced_tweets
133 .as_ref()
134 .map(|it| it.iter().all(|item| item.is_empty_extra()))
135 .unwrap_or(true)
136 && self
137 .scopes
138 .as_ref()
139 .map(|it| it.is_empty_extra())
140 .unwrap_or(true)
141 && self
142 .withheld
143 .as_ref()
144 .map(|it| it.is_empty_extra())
145 .unwrap_or(true);
146 if !res {
147 println!("Tweets {:?}", self.extra);
148 }
149 res
150 }
151}