1use serde::Deserialize;
2
3#[derive(Debug, Clone, Deserialize)]
4pub struct User {
5 pub user_id: Option<String>,
6 pub name: Option<String>,
7 pub registered_at: Option<String>,
8 pub location: Option<String>,
9 pub feedback: Option<Feedback>,
10 pub profile_picture: Option<ProfilePicture>,
11 pub reply: Option<Reply>,
12 pub presence: Option<Presence>,
13 pub badges: Option<Vec<Badge>>,
14 pub total_ads: Option<u64>,
15 pub store_id: Option<u64>,
16 pub account_type: Option<String>,
17 pub description: Option<String>,
18
19 #[serde(skip)]
20 pub pro: Option<Pro>,
21}
22
23#[derive(Debug, Clone, Deserialize)]
24pub struct Feedback {
25 pub overall_score: Option<f64>,
26 pub category_scores: Option<CategoryScores>,
27 pub received_count: Option<u64>,
28}
29
30#[derive(Debug, Clone, Deserialize)]
31pub struct CategoryScores {
32 #[serde(rename = "CLEANNESS")]
33 pub cleanness: Option<f64>,
34 #[serde(rename = "COMMUNICATION")]
35 pub communication: Option<f64>,
36 #[serde(rename = "CONFORMITY")]
37 pub conformity: Option<f64>,
38 #[serde(rename = "PACKAGE")]
39 pub package: Option<f64>,
40 #[serde(rename = "PRODUCT")]
41 pub product: Option<f64>,
42 #[serde(rename = "RECOMMENDATION")]
43 pub recommendation: Option<f64>,
44 #[serde(rename = "RESPECT")]
45 pub respect: Option<f64>,
46 #[serde(rename = "TRANSACTION")]
47 pub transaction: Option<f64>,
48 #[serde(rename = "USER_ATTENTION")]
49 pub user_attention: Option<f64>,
50}
51
52#[derive(Debug, Clone, Deserialize)]
53pub struct ProfilePicture {
54 pub extra_large_url: Option<String>,
55 pub large_url: Option<String>,
56 pub medium_url: Option<String>,
57 pub small_url: Option<String>,
58}
59
60#[derive(Debug, Clone, Deserialize)]
61pub struct Reply {
62 pub in_minutes: Option<u32>,
63 pub text: Option<String>,
64 pub rate_text: Option<String>,
65 pub rate: Option<u32>,
66 pub reply_time_text: Option<String>,
67}
68
69#[derive(Debug, Clone, Deserialize)]
70pub struct Presence {
71 pub status: Option<String>,
72 pub presence_text: Option<String>,
73 pub last_activity: Option<String>,
74 pub enabled: Option<bool>,
75}
76
77#[derive(Debug, Clone, Deserialize)]
78pub struct Badge {
79 #[serde(rename = "type")]
80 pub badge_type: Option<String>,
81 pub name: Option<String>,
82}
83
84#[derive(Debug, Clone, Deserialize)]
85pub struct Pro {
86 pub online_store_id: Option<u64>,
87 pub online_store_name: Option<String>,
88 pub owner: Option<ProOwner>,
89 pub location: Option<ProLocation>,
90 pub brand: Option<ProBrand>,
91 pub information: Option<ProInformation>,
92 pub rating: Option<ProRating>,
93}
94
95#[derive(Debug, Clone, Deserialize)]
96pub struct ProOwner {
97 #[serde(rename = "activitySectorID")]
98 pub activity_sector_id: Option<u32>,
99 #[serde(rename = "activitySector")]
100 pub activity_sector: Option<String>,
101 #[serde(rename = "categoryId")]
102 pub category_id: Option<u32>,
103 pub siren: Option<String>,
104 pub siret: Option<String>,
105 #[serde(rename = "storeId")]
106 pub store_id: Option<u64>,
107 #[serde(rename = "activeSince")]
108 pub active_since: Option<String>,
109}
110
111#[derive(Debug, Clone, Deserialize)]
112pub struct ProLocation {
113 pub address: Option<String>,
114 pub district: Option<String>,
115 pub city: Option<String>,
116 pub label: Option<String>,
117 pub lat: Option<f64>,
118 pub lng: Option<f64>,
119 pub zipcode: Option<String>,
120 pub geo_source: Option<String>,
121 pub geo_provider: Option<String>,
122 pub region: Option<String>,
123 pub region_label: Option<String>,
124 pub department: Option<String>,
125 pub dpt_label: Option<String>,
126 pub country: Option<String>,
127}
128
129#[derive(Debug, Clone, Deserialize)]
130pub struct ProBrand {
131 pub logo: Option<ProImage>,
132 pub cover: Option<ProImage>,
133 pub slogan: Option<String>,
134}
135
136#[derive(Debug, Clone, Deserialize)]
137pub struct ProImage {
138 pub large: Option<String>,
139 pub medium: Option<String>,
140 pub small: Option<String>,
141}
142
143#[derive(Debug, Clone, Deserialize)]
144pub struct ProInformation {
145 pub description: Option<String>,
146 pub opening_hours: Option<String>,
147 pub website_url: Option<String>,
148}
149
150#[derive(Debug, Clone, Deserialize)]
151pub struct ProRating {
152 pub rating_value: Option<f64>,
153 pub user_ratings_total: Option<u64>,
154 pub source: Option<String>,
155 pub source_display: Option<String>,
156 pub retrieval_time: Option<String>,
157 pub url: Option<String>,
158 pub reviews: Option<Vec<Review>>,
159}
160
161#[derive(Debug, Clone, Deserialize)]
162pub struct Review {
163 pub author_name: Option<String>,
164 pub rating_value: Option<u32>,
165 pub text: Option<String>,
166 pub review_time: Option<String>,
167}
168
169impl User {
170 pub fn is_pro(&self) -> bool {
171 self.account_type.as_deref() == Some("pro")
172 }
173
174 pub fn feedback_score(&self) -> Option<f64> {
175 self.feedback
176 .as_ref()
177 .and_then(|f| f.overall_score)
178 .map(|score| score * 5.0)
179 }
180
181 pub fn profile_picture_url(&self) -> Option<&str> {
182 self.profile_picture
183 .as_ref()
184 .and_then(|p| p.extra_large_url.as_deref())
185 }
186
187 pub(crate) fn with_pro_data(mut self, pro: Option<Pro>) -> Self {
188 self.pro = pro;
189 self
190 }
191}