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}