1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
use super::*;

/// <https://vk.com/dev/objects/user>
#[derive(Deserialize, Clone, Debug)]
pub struct User {
    // Main fields
    pub id: Integer,
    pub first_name: String,
    pub last_name: String,
    pub deactivated: Option<String>,

    // Optional fields A-L
    pub about: Option<String>,
    pub activities: Option<String>,
    pub bdate: Option<String>,
    pub blacklisted: Option<Integer>,
    pub blacklisted_by_me: Option<Integer>,
    pub books: Option<String>,
    pub can_post: Option<Integer>,
    pub can_see_all_posts: Option<Integer>,
    pub can_see_audio: Option<Integer>,
    pub can_send_friend_request: Option<Integer>,
    pub can_write_private_message: Option<Integer>,
    pub career: Option<Vec<Career>>,
    pub city: Option<geo::City>,
    pub common_count: Option<Integer>,

    // connections
    pub skype: Option<String>,
    pub facebook: Option<String>,
    pub facebook_name: Option<String>,
    pub twitter: Option<String>,
    pub livejournal: Option<String>,
    pub instagram: Option<String>,

    pub contacts: Option<Contacts>,
    pub counters: Option<Counters>,
    pub country: Option<geo::Country>,
    pub crop_photo: Option<photo::Cropped>,
    pub domain: Option<String>,

    // education
    pub university: Option<Integer>,
    pub university_name: Option<String>,
    pub faculty: Option<Integer>,
    pub faculty_name: Option<String>,
    pub graduation: Option<Integer>,

    pub exports: Option<Exports>,

    // first_name_{case}
    pub first_name_nom: Option<String>,
    pub first_name_gen: Option<String>,
    pub first_name_dat: Option<String>,
    pub first_name_acc: Option<String>,
    pub first_name_ins: Option<String>,
    pub first_name_abl: Option<String>,

    pub followers_count: Option<Integer>,
    pub friend_status: Option<Integer>,
    pub games: Option<String>,
    pub has_mobile: Option<Integer>,
    pub has_photo: Option<Integer>,
    pub home_town: Option<String>,
    pub interests: Option<String>,
    pub is_favorite: Option<Integer>,
    pub is_friend: Option<Integer>,
    pub is_hidden_from_feed: Option<Integer>,

    // last_name_{case}
    pub last_name_nom: Option<String>,
    pub last_name_gen: Option<String>,
    pub last_name_dat: Option<String>,
    pub last_name_acc: Option<String>,
    pub last_name_ins: Option<String>,
    pub last_name_abl: Option<String>,

    pub last_seen: Option<LastSeen>,
    pub lists: Option<String>,

    // Optional fields M-W
    pub maiden_name: Option<String>,
    pub military: Option<Vec<Military>>,
    pub movies: Option<String>,
    pub music: Option<String>,
    pub nickname: Option<String>,
    pub occupation: Option<Occupation>,

    // online
    pub online: Option<Integer>,
    pub online_mobile: Option<Integer>,
    pub online_app: Option<String>,

    pub personal: Option<Personal>,
    pub photo_50: Option<String>,
    pub photo_100: Option<String>,
    pub photo_200_orig: Option<String>,
    pub photo_200: Option<String>,
    pub photo_400_orig: Option<String>,
    pub photo_id: Option<String>,
    pub photo_max: Option<String>,
    pub photo_max_orig: Option<String>,
    pub quotes: Option<String>,
    pub relatives: Option<Vec<Relative>>,

    // relation
    pub relation: Option<Integer>,
    pub relation_partner: Option<Box<User>>,

    pub schools: Option<Vec<School>>,
    pub screen_name: Option<String>,
    pub sex: Option<Integer>,
    pub site: Option<String>,

    // status
    pub status: Option<String>,
    pub status_audio: Option<audio::Audio>,

    pub timezone: Option<Integer>,
    pub trending: Option<Integer>,
    pub tv: Option<String>,
    pub universities: Option<Vec<University>>,
    pub verified: Option<Integer>,
    pub wall_default: Option<String>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Career {
    pub group_id: Option<Integer>,
    pub company: Option<String>,
    pub country_id: Option<Integer>,
    pub city_id: Option<Integer>,
    pub city_name: Option<String>,
    pub from: Option<Integer>,
    pub until: Option<Integer>,
    pub position: Option<String>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Contacts {
    pub mobile_phone: Option<String>,
    pub home_phone: Option<String>,
}

#[derive(Deserialize, Copy, Clone, Debug)]
pub struct Counters {
    pub albums: Option<Integer>,
    pub videos: Option<Integer>,
    pub audios: Option<Integer>,
    pub photos: Option<Integer>,
    pub notes: Option<Integer>,
    pub friends: Option<Integer>,
    pub groups: Option<Integer>,
    pub online_friends: Option<Integer>,
    pub mutual_friends: Option<Integer>,
    pub user_videos: Option<Integer>,
    pub followers: Option<Integer>,
    pub pages: Option<Integer>,
}

#[derive(Deserialize, Copy, Clone, Debug)]
pub struct Exports {
    pub twitter: Option<Integer>,
    pub facebook: Option<Integer>,
    pub livejournal: Option<Integer>,
    pub instagram: Option<Integer>,
}

#[derive(Deserialize, Copy, Clone, Debug)]
pub struct LastSeen {
    pub time: Option<Integer>,
    pub platform: Option<Integer>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Military {
    pub unit: Option<String>,
    pub unit_id: Option<Integer>,
    pub country_id: Option<Integer>,
    pub from: Option<Integer>,
    pub until: Option<Integer>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Occupation {
    #[serde(rename = "type")]
    pub type_: Option<String>,

    pub id: Option<Integer>,
    pub name: Option<String>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Personal {
    pub political: Option<Integer>,
    pub langs: Option<Vec<String>>,
    pub religion: Option<String>,
    pub inspired_by: Option<String>,
    pub people_main: Option<Integer>,
    pub life_main: Option<Integer>,
    pub smoking: Option<Integer>,
    pub alcohol: Option<Integer>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct Relative {
    pub id: Option<Integer>,
    pub name: Option<String>,

    #[serde(rename = "type")]
    pub type_: Option<String>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct School {
    pub id: Option<String>,
    pub country: Option<Integer>,
    pub city: Option<Integer>,
    pub name: Option<String>,
    pub year_from: Option<Integer>,
    pub year_to: Option<Integer>,
    pub year_graduated: Option<Integer>,
    pub class: Option<String>,
    pub speciality: Option<String>,

    #[serde(rename = "type")]
    pub type_: Option<Integer>,

    pub type_str: Option<String>,
}

#[derive(Deserialize, Clone, Debug)]
pub struct University {
    pub id: Option<Integer>,
    pub country: Option<Integer>,
    pub city: Option<Integer>,
    pub name: Option<String>,
    pub faculty: Option<Integer>,
    pub faculty_name: Option<String>,
    pub chair: Option<Integer>,
    pub chair_name: Option<String>,
    pub graduation: Option<Integer>,
    pub education_form: Option<String>,
    pub education_status: Option<String>,
}