twitter_v2/data/
tweet.rs

1use super::entity::FullTextEntities;
2use super::withheld::Withheld;
3use super::GeoCoordinates;
4use crate::id::{NumericId, StringId};
5use serde::{Deserialize, Serialize};
6use time::OffsetDateTime;
7
8#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
9pub struct TweetPublicMetrics {
10    pub retweet_count: usize,
11    pub reply_count: usize,
12    pub like_count: usize,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub quote_count: Option<usize>,
15}
16
17#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
18pub struct TweetNonPublicMetrics {
19    pub impression_count: Option<usize>,
20}
21
22#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
23pub struct TweetPromotedMetrics {
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub impression_count: Option<usize>,
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub retweet_count: Option<usize>,
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub reply_count: Option<usize>,
30    #[serde(skip_serializing_if = "Option::is_none")]
31    pub like_count: Option<usize>,
32}
33
34#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
35pub struct TweetOrganicMetrics {
36    pub impression_count: usize,
37    pub retweet_count: usize,
38    pub reply_count: usize,
39    pub like_count: usize,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
43pub struct Attachments {
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub media_keys: Option<Vec<StringId>>,
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub poll_ids: Option<Vec<NumericId>>,
48}
49
50#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
51pub struct ContextAnnotationDescription {
52    pub id: NumericId,
53    pub name: String,
54    #[serde(skip_serializing_if = "Option::is_none")]
55    pub description: Option<String>,
56}
57
58#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
59pub struct ContextAnnotation {
60    pub domain: ContextAnnotationDescription,
61    pub entity: ContextAnnotationDescription,
62}
63
64#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
65#[cfg_attr(feature = "arbitrary_precision", derive(Eq))]
66pub struct TweetGeo {
67    pub place_id: Option<StringId>,
68    #[serde(skip_serializing_if = "Option::is_none")]
69    pub coordinates: Option<GeoCoordinates>,
70}
71
72#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
73#[serde(rename_all = "snake_case")]
74pub enum ReferencedTweetType {
75    Quoted,
76}
77
78#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
79#[serde(rename_all = "snake_case")]
80pub enum ReferencedTweetKind {
81    Quoted,
82    RepliedTo,
83    Retweeted,
84}
85
86#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
87pub struct ReferencedTweet {
88    #[serde(rename = "type")]
89    pub kind: ReferencedTweetKind,
90    pub id: NumericId,
91}
92
93#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
94#[serde(rename_all = "camelCase")]
95pub enum ReplySettings {
96    Everyone,
97    MentionedUsers,
98    Followers,
99}
100
101#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
102#[cfg_attr(feature = "arbitrary_precision", derive(Eq))]
103pub struct Tweet {
104    pub id: NumericId,
105    pub text: String,
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub attachments: Option<Attachments>,
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub author_id: Option<NumericId>,
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub context_annotations: Option<Vec<ContextAnnotation>>,
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub conversation_id: Option<NumericId>,
114    #[serde(
115        default,
116        with = "time::serde::rfc3339::option",
117        skip_serializing_if = "Option::is_none"
118    )]
119    pub created_at: Option<OffsetDateTime>,
120    #[serde(skip_serializing_if = "Option::is_none")]
121    pub entities: Option<FullTextEntities>,
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub geo: Option<TweetGeo>,
124    #[serde(skip_serializing_if = "Option::is_none")]
125    pub in_reply_to_user_id: Option<NumericId>,
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub lang: Option<String>,
128    #[serde(skip_serializing_if = "Option::is_none")]
129    pub non_public_metrics: Option<TweetNonPublicMetrics>,
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub organic_metrics: Option<TweetOrganicMetrics>,
132    #[serde(skip_serializing_if = "Option::is_none")]
133    pub possibly_sensitive: Option<bool>,
134    #[serde(skip_serializing_if = "Option::is_none")]
135    pub promoted_metrics: Option<TweetPromotedMetrics>,
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub public_metrics: Option<TweetPublicMetrics>,
138    #[serde(skip_serializing_if = "Option::is_none")]
139    pub referenced_tweets: Option<Vec<ReferencedTweet>>,
140    #[serde(skip_serializing_if = "Option::is_none")]
141    pub reply_settings: Option<ReplySettings>,
142    #[serde(skip_serializing_if = "Option::is_none")]
143    pub source: Option<String>,
144    #[serde(skip_serializing_if = "Option::is_none")]
145    pub withheld: Option<Withheld>,
146}