1use serde::{Deserialize, Serialize};
2use std::collections::HashSet;
3
4#[derive(Serialize, Deserialize, Debug, Eq, Hash, PartialEq, Clone, Default)]
5pub enum TweetFields {
6 #[serde(rename = "article")]
7 #[default]
8 Article,
9 #[serde(rename = "attachments")]
10 Attachments,
11 #[serde(rename = "author_id")]
12 AuthorId,
13 #[serde(rename = "card_uri")]
14 CardUri,
15 #[serde(rename = "community_id")]
16 CommunityId,
17 #[serde(rename = "context_annotations")]
18 ContextAnnotations,
19 #[serde(rename = "conversation_id")]
20 ConversationId,
21 #[serde(rename = "created_at")]
22 CreatedAt,
23 #[serde(rename = "display_text_range")]
24 DisplayTextRange,
25 #[serde(rename = "edit_controls")]
26 EditControls,
27 #[serde(rename = "edit_history_tweet_ids")]
28 EditHistoryTweetIds,
29 #[serde(rename = "entities")]
30 Entities,
31 #[serde(rename = "geo")]
32 Geo,
33 #[serde(rename = "id")]
34 Id,
35 #[serde(rename = "in_reply_to_user_id")]
36 InReplyToUserId,
37 #[serde(rename = "lang")]
38 Lang,
39 #[serde(rename = "media_metadata")]
40 MediaMetadata,
41 #[serde(rename = "non_public_metrics")]
42 NonPublicMetrics,
43 #[serde(rename = "note_tweet")]
44 NoteTweet,
45 #[serde(rename = "organic_metrics")]
46 OrganicMetrics,
47 #[serde(rename = "possibly_sensitive")]
48 PossiblySensitive,
49 #[serde(rename = "promoted_metrics")]
50 PromotedMetrics,
51 #[serde(rename = "public_metrics")]
52 PublicMetrics,
53 #[serde(rename = "referenced_tweets")]
54 ReferencedTweets,
55 #[serde(rename = "reply_settings")]
56 ReplySettings,
57 #[serde(rename = "scopes")]
58 Scopes,
59 #[serde(rename = "source")]
60 Source,
61 #[serde(rename = "text")]
62 Text,
63 #[serde(rename = "withheld")]
64 Withheld,
65}
66
67impl TweetFields {
68 pub fn all() -> HashSet<Self> {
69 let mut result = HashSet::new();
70 result.insert(Self::Article);
71 result.insert(Self::Attachments);
72 result.insert(Self::AuthorId);
73 result.insert(Self::CardUri);
74 result.insert(Self::CommunityId);
75 result.insert(Self::ContextAnnotations);
76 result.insert(Self::ConversationId);
77 result.insert(Self::CreatedAt);
78 result.insert(Self::DisplayTextRange);
79 result.insert(Self::EditControls);
80 result.insert(Self::EditHistoryTweetIds);
81 result.insert(Self::Entities);
82 result.insert(Self::Geo);
83 result.insert(Self::Id);
84 result.insert(Self::InReplyToUserId);
85 result.insert(Self::Lang);
86 result.insert(Self::MediaMetadata);
87 result.insert(Self::NonPublicMetrics);
88 result.insert(Self::NoteTweet);
89 result.insert(Self::OrganicMetrics);
90 result.insert(Self::PossiblySensitive);
91 result.insert(Self::PromotedMetrics);
92 result.insert(Self::PublicMetrics);
93 result.insert(Self::ReferencedTweets);
94 result.insert(Self::ReplySettings);
95 result.insert(Self::Scopes);
96 result.insert(Self::Source);
97 result.insert(Self::Text);
98 result.insert(Self::Withheld);
99 result
100 }
101
102 pub fn organic() -> HashSet<Self> {
103 let mut result = HashSet::new();
104 result.insert(Self::Article);
105 result.insert(Self::Attachments);
106 result.insert(Self::AuthorId);
107 result.insert(Self::CardUri);
108 result.insert(Self::CommunityId);
109 result.insert(Self::ContextAnnotations);
110 result.insert(Self::ConversationId);
111 result.insert(Self::CreatedAt);
112 result.insert(Self::DisplayTextRange);
113 result.insert(Self::EditControls);
114 result.insert(Self::EditHistoryTweetIds);
115 result.insert(Self::Entities);
116 result.insert(Self::Geo);
117 result.insert(Self::Id);
118 result.insert(Self::InReplyToUserId);
119 result.insert(Self::Lang);
120 result.insert(Self::MediaMetadata);
121 result.insert(Self::NonPublicMetrics);
122 result.insert(Self::NoteTweet);
123 result.insert(Self::OrganicMetrics);
124 result.insert(Self::PossiblySensitive);
125 result.insert(Self::PromotedMetrics);
126 result.insert(Self::PublicMetrics);
127 result.insert(Self::ReferencedTweets);
128 result.insert(Self::ReplySettings);
129 result.insert(Self::Scopes);
130 result.insert(Self::Source);
131 result.insert(Self::Text);
132 result.insert(Self::Withheld);
133 result
134 }
135
136 pub fn open() -> HashSet<Self> {
137 let mut result = HashSet::new();
138 result.insert(Self::Article);
139 result.insert(Self::Attachments);
140 result.insert(Self::AuthorId);
141 result.insert(Self::CardUri);
142 result.insert(Self::CommunityId);
143 result.insert(Self::ContextAnnotations);
144 result.insert(Self::ConversationId);
145 result.insert(Self::CreatedAt);
146 result.insert(Self::DisplayTextRange);
147 result.insert(Self::EditControls);
148 result.insert(Self::EditHistoryTweetIds);
149 result.insert(Self::Entities);
150 result.insert(Self::Geo);
151 result.insert(Self::Id);
152 result.insert(Self::InReplyToUserId);
153 result.insert(Self::Lang);
154 result.insert(Self::MediaMetadata);
155 result.insert(Self::NoteTweet);
156 result.insert(Self::PossiblySensitive);
157 result.insert(Self::PublicMetrics);
158 result.insert(Self::ReferencedTweets);
159 result.insert(Self::ReplySettings);
160 result.insert(Self::Scopes);
161 result.insert(Self::Source);
162 result.insert(Self::Text);
163 result.insert(Self::Withheld);
164 result
165 }
166}
167
168impl std::fmt::Display for TweetFields {
169 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
170 match self {
171 Self::Article => write!(f, "article"),
172 Self::Attachments => write!(f, "attachments"),
173 Self::AuthorId => write!(f, "author_id"),
174 Self::CardUri => write!(f, "card_uri"),
175 Self::CommunityId => write!(f, "community_id"),
176 Self::ContextAnnotations => write!(f, "context_annotations"),
177 Self::ConversationId => write!(f, "conversation_id"),
178 Self::CreatedAt => write!(f, "created_at"),
179 Self::DisplayTextRange => write!(f, "display_text_range"),
180 Self::EditControls => write!(f, "edit_controls"),
181 Self::EditHistoryTweetIds => write!(f, "edit_history_tweet_ids"),
182 Self::Entities => write!(f, "entities"),
183 Self::Geo => write!(f, "geo"),
184 Self::Id => write!(f, "id"),
185 Self::InReplyToUserId => write!(f, "in_reply_to_user_id"),
186 Self::Lang => write!(f, "lang"),
187 Self::MediaMetadata => write!(f, "media_metadata"),
188 Self::NonPublicMetrics => write!(f, "non_public_metrics"),
189 Self::NoteTweet => write!(f, "note_tweet"),
190 Self::OrganicMetrics => write!(f, "organic_metrics"),
191 Self::PossiblySensitive => write!(f, "possibly_sensitive"),
192 Self::PromotedMetrics => write!(f, "promoted_metrics"),
193 Self::PublicMetrics => write!(f, "public_metrics"),
194 Self::ReferencedTweets => write!(f, "referenced_tweets"),
195 Self::ReplySettings => write!(f, "reply_settings"),
196 Self::Scopes => write!(f, "scopes"),
197 Self::Source => write!(f, "source"),
198 Self::Text => write!(f, "text"),
199 Self::Withheld => write!(f, "withheld"),
200 }
201 }
202}