Skip to main content

psn_api_rs/
models.rs

1/// `models` are used to deserialize psn response json.
2/// Some response fields are ignored so if you need more/less fields you can use your own struct as long as it impl `serde::Deserialize`.
3
4///The response type of `get_profile()`
5#[derive(Serialize, Deserialize, Debug)]
6#[serde(rename_all = "camelCase")]
7pub struct PSNUser {
8    pub online_id: String,
9    pub np_id: String,
10    pub region: String,
11    pub avatar_url: String,
12    pub about_me: String,
13    pub languages_used: Vec<String>,
14    pub plus: u8,
15    pub trophy_summary: PSNUserTrophySummary,
16}
17
18#[derive(Serialize, Deserialize, Debug)]
19#[serde(rename_all = "camelCase")]
20pub struct PSNUserTrophySummary {
21    pub level: u8,
22    pub progress: u8,
23    pub earned_trophies: EarnedTrophies,
24}
25
26///The response type of `get_titles()`
27#[derive(Serialize, Deserialize, Debug)]
28#[serde(rename_all = "camelCase")]
29pub struct TrophyTitles {
30    pub total_results: u32,
31    pub offset: u32,
32    pub trophy_titles: Vec<TrophyTitle>,
33}
34
35#[derive(Serialize, Deserialize, Debug)]
36#[serde(rename_all = "camelCase")]
37pub struct TrophyTitle {
38    pub np_communication_id: String,
39    pub trophy_title_name: String,
40    pub trophy_title_detail: String,
41    pub trophy_title_icon_url: String,
42    pub trophy_title_platfrom: String,
43    pub has_trophy_groups: bool,
44    pub defined_trophies: EarnedTrophies,
45    #[serde(alias = "comparedUser")]
46    pub title_detail: TitleDetail,
47}
48
49#[derive(Serialize, Deserialize, Debug)]
50#[serde(rename_all = "camelCase")]
51pub struct TitleDetail {
52    pub progress: u8,
53    pub earned_trophies: EarnedTrophies,
54    pub last_update_date: String,
55}
56
57#[derive(Serialize, Deserialize, Debug)]
58pub struct EarnedTrophies {
59    pub platinum: u32,
60    pub gold: u32,
61    pub silver: u32,
62    pub bronze: u32,
63}
64
65///The response type of `get_trophy_set()`
66#[derive(Serialize, Deserialize, Debug)]
67#[serde(rename_all = "camelCase")]
68pub struct TrophySet {
69    pub trophies: Vec<Trophy>,
70}
71
72/// If one trophy is hidden and the account you use to login PSN has not obtained it,
73/// all the `Option<String>` fields will return `None`.
74#[derive(Serialize, Deserialize, Debug)]
75#[serde(rename_all = "camelCase")]
76pub struct Trophy {
77    pub trophy_id: u8,
78    pub trophy_hidden: bool,
79    pub trophy_type: Option<String>,
80    pub trophy_name: Option<String>,
81    pub trophy_detail: Option<String>,
82    pub trophy_icon_url: Option<String>,
83    pub trophy_rare: u8,
84    pub trophy_earned_rate: String,
85    #[serde(alias = "comparedUser")]
86    pub user_info: TrophyUser,
87}
88
89/// `earned_date` field will return `None` if this has not been earned by according `online_id`.
90#[derive(Serialize, Deserialize, Debug)]
91#[serde(rename_all = "camelCase")]
92pub struct TrophyUser {
93    pub online_id: String,
94    pub earned: bool,
95    pub earned_date: Option<String>,
96}
97
98///The response type of `get_message_threads()`
99#[derive(Serialize, Deserialize, Debug)]
100#[serde(rename_all = "camelCase")]
101pub struct MessageThreadsSummary {
102    pub threads: Vec<MessageThreadSummary>,
103    pub start: u32,
104    pub size: u32,
105    pub total_size: u32,
106}
107
108#[derive(Serialize, Deserialize, Debug)]
109#[serde(rename_all = "camelCase")]
110pub struct MessageThreadSummary {
111    pub thread_id: String,
112    pub thread_type: u8,
113    pub thread_modified_date: String,
114}
115
116///The response type of `get_message_thread()`
117#[derive(Serialize, Deserialize, Debug)]
118#[serde(rename_all = "camelCase")]
119pub struct MessageThread {
120    pub thread_members: Vec<ThreadMember>,
121    pub thread_name_detail: ThreadName,
122    pub thread_thumbnail_detail: ThreadThumbnail,
123    pub thread_property: ThreadProperty,
124    pub new_arrival_event_detail: NewArrivalEventDetail,
125    pub thread_events: Vec<ThreadEvent>,
126    pub thread_id: String,
127    pub thread_type: u8,
128    pub thread_modified_date: String,
129    pub results_count: u32,
130    pub max_event_index_cursor: String,
131    pub since_event_index_cursor: String,
132    pub latest_event_index: String,
133    pub end_of_thread_event: bool,
134}
135
136#[derive(Serialize, Deserialize, Debug)]
137#[serde(rename_all = "camelCase")]
138pub struct ThreadMember {
139    pub account_id: String,
140    pub online_id: String,
141}
142
143#[derive(Serialize, Deserialize, Debug)]
144#[serde(rename_all = "camelCase")]
145pub struct ThreadName {
146    pub status: u8,
147    pub thread_name: String,
148}
149
150#[derive(Serialize, Deserialize, Debug)]
151#[serde(rename_all = "camelCase")]
152pub struct ThreadThumbnail {
153    pub status: u8,
154}
155
156#[derive(Serialize, Deserialize, Debug)]
157#[serde(rename_all = "camelCase")]
158pub struct ThreadProperty {
159    pub favorite_detail: FavoriteDetail,
160    pub notification_detail: NotificationDetail,
161    pub kickout_flag: bool,
162    pub thread_join_date: String,
163}
164
165#[derive(Serialize, Deserialize, Debug)]
166#[serde(rename_all = "camelCase")]
167pub struct FavoriteDetail {
168    pub favorite_flag: bool,
169}
170
171#[derive(Serialize, Deserialize, Debug)]
172#[serde(rename_all = "camelCase")]
173pub struct NotificationDetail {
174    pub push_notification_flag: bool,
175}
176
177#[derive(Serialize, Deserialize, Debug)]
178#[serde(rename_all = "camelCase")]
179pub struct NewArrivalEventDetail {
180    pub new_arrival_event_flag: bool,
181}
182
183#[derive(Serialize, Deserialize, Debug)]
184#[serde(rename_all = "camelCase")]
185pub struct ThreadEvent {
186    pub message_event_detail: MessageEventDetail,
187}
188
189#[derive(Serialize, Deserialize, Debug)]
190#[serde(rename_all = "camelCase")]
191pub struct MessageEventDetail {
192    pub event_index: String,
193    pub post_date: String,
194    pub event_category_code: u32,
195    pub alt_event_category_code: u32,
196    pub sender: ThreadMember,
197    pub attached_media_path: Option<String>,
198    pub message_detail: MessageDetail,
199}
200
201#[derive(Serialize, Deserialize, Debug)]
202#[serde(rename_all = "camelCase")]
203pub struct MessageDetail {
204    pub body: Option<String>,
205}
206
207///The response type of `search_store_items()`
208#[derive(Serialize, Deserialize, Debug)]
209#[serde(rename_all = "camelCase")]
210pub struct StoreSearchResult {
211    // skip this field for now
212    //        pub data: StoreSearchData,
213    pub included: Vec<StoreSearchData>,
214}
215
216#[derive(Serialize, Deserialize, Debug)]
217#[serde(rename_all = "camelCase")]
218pub struct StoreSearchData {
219    pub attributes: StoreSearchAttribute,
220    pub id: String,
221    pub relationships: StoreSearchRelationship,
222    #[serde(alias = "type")]
223    pub typ: String,
224}
225
226#[derive(Serialize, Deserialize, Debug)]
227#[serde(rename_all = "camelCase")]
228// what a mess.
229pub struct StoreSearchAttribute {
230    #[serde(alias = "badge-info")]
231    pub badge_info: BadgeInfo,
232    #[serde(alias = "cero-z-status")]
233    pub ceroz_status: CeroZStatus,
234    #[serde(alias = "content-rating")]
235    pub content_rating: ContentRating,
236    #[serde(alias = "content-type")]
237    pub content_type: String,
238    #[serde(alias = "default-sku-id")]
239    pub default_sku_id: String,
240    #[serde(alias = "dob-required")]
241    pub dob_required: bool,
242    #[serde(alias = "file-size")]
243    pub file_size: FileSize,
244    #[serde(alias = "game-content-type")]
245    pub game_content_type: String,
246    pub genres: Vec<String>,
247    #[serde(alias = "is-igc-upsell")]
248    pub is_igc_upsell: bool,
249    #[serde(alias = "is-multiplayer-upsell")]
250    pub is_multiplayer_upsell: bool,
251    #[serde(alias = "kamaji-relationship")]
252    pub kamaji_relationship: String,
253    #[serde(alias = "legal-text")]
254    pub large_text: String,
255    #[serde(alias = "long-description")]
256    pub long_description: String,
257    #[serde(alias = "macross-brain-context")]
258    pub macross_brain_context: String,
259    #[serde(alias = "media-list")]
260    pub media_list: MediaList,
261    pub name: String,
262    #[serde(alias = "nsx-confirm-message")]
263    pub nsx_confirm_message: String,
264    pub parent: Option<ParentGameInfo>,
265    pub platforms: Vec<String>,
266    #[serde(alias = "plus-reward-description")]
267    pub plus_reward_description: Option<String>,
268    #[serde(alias = "primary-classification")]
269    pub primary_classification: String,
270    #[serde(alias = "secondary-classification")]
271    pub secondary_classification: String,
272    #[serde(alias = "provider-name")]
273    pub provider_name: String,
274    #[serde(alias = "ps-camera-compatibility")]
275    pub ps_camera_compatibility: String,
276    #[serde(alias = "ps-move-compatibility")]
277    pub ps_move_compatibility: String,
278    #[serde(alias = "ps-vr-compatibility")]
279    pub ps_vr_compatibility: String,
280    #[serde(alias = "release-date")]
281    pub release_date: String,
282    pub skus: Vec<Sku>,
283    #[serde(alias = "star-rating")]
284    pub star_rating: StarRating,
285    #[serde(alias = "subtitle-language-codes")]
286    // ToDo: this field could be an option with other type
287    pub subtitle_language_codes: Vec<String>,
288    #[serde(alias = "tertiary-classification")]
289    pub tertiary_classification: String,
290    #[serde(alias = "thumbnail-url-base")]
291    pub thumbnail_url_base: String,
292    #[serde(alias = "top-category")]
293    pub top_category: String,
294    #[serde(alias = "upsell-info")]
295    // ToDo: this field could be an option with other type
296    pub upsell_info: Option<String>,
297    #[serde(alias = "voice-language-codes")]
298    // ToDo: this field could be an option with other type
299    pub voice_language_codes: Vec<String>,
300}
301
302#[derive(Serialize, Deserialize, Debug)]
303#[serde(rename_all = "camelCase")]
304pub struct BadgeInfo {
305    #[serde(alias = "non-plus-user")]
306    pub non_plus_user: Option<BadgeInfoData>,
307    #[serde(alias = "plus-user")]
308    pub plus_user: Option<BadgeInfoData>,
309}
310
311#[derive(Serialize, Deserialize, Debug)]
312#[serde(rename_all = "camelCase")]
313pub struct BadgeInfoData {
314    #[serde(alias = "discount-percentage")]
315    pub discount_percentage: u8,
316    #[serde(alias = "is-plus")]
317    pub is_plus: bool,
318    #[serde(alias = "type")]
319    pub typ: String,
320}
321
322#[derive(Serialize, Deserialize, Debug)]
323#[serde(rename_all = "camelCase")]
324pub struct CeroZStatus {
325    #[serde(alias = "is-allowed-in-cart")]
326    pub is_allowed_in_cart: bool,
327    #[serde(alias = "is-on")]
328    pub is_on: bool,
329}
330
331#[derive(Serialize, Deserialize, Debug)]
332#[serde(rename_all = "camelCase")]
333pub struct ContentRating {
334    #[serde(alias = "content-descriptors")]
335    pub content_descriptors: Vec<ContentDescriptor>,
336    pub content_interactive_element: Vec<ContentInteractiveElement>,
337    #[serde(alias = "rating-system")]
338    pub rating_system: String,
339    pub url: String,
340}
341
342#[derive(Serialize, Deserialize, Debug)]
343#[serde(rename_all = "camelCase")]
344pub struct ContentDescriptor {
345    pub description: String,
346    pub name: String,
347    pub url: Option<String>,
348}
349
350#[derive(Serialize, Deserialize, Debug)]
351#[serde(rename_all = "camelCase")]
352pub struct ContentInteractiveElement {
353    pub description: String,
354    pub name: String,
355}
356
357#[derive(Serialize, Deserialize, Debug)]
358#[serde(rename_all = "camelCase")]
359pub struct FileSize {
360    pub unit: String,
361    pub value: f32,
362}
363
364#[derive(Serialize, Deserialize, Debug)]
365#[serde(rename_all = "camelCase")]
366pub struct MediaList {
367    pub preview: Vec<Link>,
368    pub promo: Promo,
369    pub screenshots: Vec<Link>,
370}
371
372#[derive(Serialize, Deserialize, Debug)]
373#[serde(rename_all = "camelCase")]
374pub struct Promo {
375    pub images: Vec<Link>,
376    pub videos: Vec<Link>,
377}
378
379#[derive(Serialize, Deserialize, Debug)]
380#[serde(rename_all = "camelCase")]
381pub struct Link {
382    pub url: String,
383}
384
385#[derive(Serialize, Deserialize, Debug)]
386#[serde(rename_all = "camelCase")]
387pub struct ParentGameInfo {
388    pub id: String,
389    pub name: String,
390    pub thumbnail: String,
391    pub url: String,
392}
393
394#[derive(Serialize, Deserialize, Debug)]
395#[serde(rename_all = "camelCase")]
396pub struct Sku {
397    pub entitlements: Vec<Entitlement>,
398    pub id: String,
399    #[serde(alias = "is-preorder")]
400    pub is_preorder: bool,
401    //ToDo: could be other type.
402    pub multibuy: Option<String>,
403    pub name: String,
404    #[serde(alias = "playability-date")]
405    pub playability_date: String,
406    #[serde(alias = "plus-reward-description")]
407    pub plus_reward_description: Option<String>,
408    pub prices: Price,
409}
410
411#[derive(Serialize, Deserialize, Debug)]
412#[serde(rename_all = "camelCase")]
413pub struct Entitlement {
414    pub duration: u32,
415    #[serde(alias = "exp-after-first-use")]
416    pub exp_after_first_use: u32,
417}
418
419#[derive(Serialize, Deserialize, Debug)]
420#[serde(rename_all = "camelCase")]
421pub struct Price {
422    #[serde(alias = "non-plus-user")]
423    pub non_plus_user: PriceData,
424    #[serde(alias = "plus-user")]
425    pub plus_user: PriceData,
426}
427
428#[derive(Serialize, Deserialize, Debug)]
429#[serde(rename_all = "camelCase")]
430pub struct PriceData {
431    #[serde(alias = "actual-price")]
432    pub actual_price: PriceDisplayValue,
433    pub availability: StartEndDate,
434    #[serde(alias = "discount-percentage")]
435    pub discount_percentage: u8,
436    #[serde(alias = "is-plus")]
437    pub is_plus: bool,
438    #[serde(alias = "strikethrough-price")]
439    pub strikethrough_price: Option<PriceDisplayValue>,
440    #[serde(alias = "upsell-price")]
441    pub upsell_price: Option<PriceDisplayValue>,
442}
443
444#[derive(Serialize, Deserialize, Debug)]
445#[serde(rename_all = "camelCase")]
446pub struct PriceDisplayValue {
447    pub display: String,
448    pub value: u16,
449}
450
451#[derive(Serialize, Deserialize, Debug)]
452#[serde(rename_all = "camelCase")]
453pub struct StartEndDate {
454    #[serde(alias = "end-date")]
455    pub end_date: Option<String>,
456    #[serde(alias = "start-date")]
457    pub start_date: Option<String>,
458}
459
460#[derive(Serialize, Deserialize, Debug)]
461#[serde(rename_all = "camelCase")]
462pub struct StarRating {
463    pub score: f32,
464    pub total: u32,
465}
466
467#[derive(Serialize, Deserialize, Debug)]
468#[serde(rename_all = "camelCase")]
469pub struct StoreSearchRelationship {
470    pub children: StoreSearchRelationshipChildren,
471    #[serde(alias = "legacy-skus")]
472    pub legacy_skus: StoreSearchRelationshipLegacySkus,
473}
474
475#[derive(Serialize, Deserialize, Debug)]
476#[serde(rename_all = "camelCase")]
477pub struct StoreSearchRelationshipChildren {
478    pub data: Vec<StoreSearchRelationshipData>,
479}
480
481#[derive(Serialize, Deserialize, Debug)]
482#[serde(rename_all = "camelCase")]
483pub struct StoreSearchRelationshipLegacySkus {
484    pub data: Vec<StoreSearchRelationshipData>,
485}
486
487#[derive(Serialize, Deserialize, Debug)]
488#[serde(rename_all = "camelCase")]
489pub struct StoreSearchRelationshipData {
490    pub id: String,
491    #[serde(alias = "type")]
492    pub typ: String,
493}