1use super::entity::{FullTextEntities, UrlEntity};
2use super::withheld::Withheld;
3use crate::id::NumericId;
4use serde::{Deserialize, Serialize};
5use time::OffsetDateTime;
6use url::Url;
7
8#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
9pub struct UserUrlEntites {
10 #[serde(skip_serializing_if = "Option::is_none")]
11 pub urls: Option<Vec<UrlEntity>>,
12}
13
14#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
15#[cfg_attr(feature = "arbitrary_precision", derive(Eq))]
16pub struct UserEntities {
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub url: Option<UserUrlEntites>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub description: Option<FullTextEntities>,
21}
22
23#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
24pub struct UserPublicMetrics {
25 pub followers_count: usize,
26 pub following_count: usize,
27 pub tweet_count: usize,
28 pub listed_count: usize,
29}
30
31#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
32#[cfg_attr(feature = "arbitrary_precision", derive(Eq))]
33pub struct User {
34 pub id: NumericId,
35 pub name: String,
36 pub username: String,
37 #[serde(
38 default,
39 with = "time::serde::rfc3339::option",
40 skip_serializing_if = "Option::is_none"
41 )]
42 pub created_at: Option<OffsetDateTime>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub description: Option<String>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub entities: Option<UserEntities>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub location: Option<String>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 pub pinned_tweet_id: Option<NumericId>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub profile_image_url: Option<Url>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 pub protected: Option<bool>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 pub public_metrics: Option<UserPublicMetrics>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub url: Option<String>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 pub verified: Option<bool>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 pub withheld: Option<Withheld>,
63}