twapi_v2/responses/
tweets.rs

1use 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}