Skip to main content

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, 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}