Skip to main content

discogs_rs/
models.rs

1use serde::{Deserialize, Serialize};
2use std::collections::BTreeMap;
3
4pub type ExtraFields = BTreeMap<String, serde_json::Value>;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct RateLimit {
8    pub limit: u32,
9    pub used: u32,
10    pub remaining: u32,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct ApiResponse<T> {
15    pub data: T,
16    pub rate_limit: Option<RateLimit>,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct Pagination {
21    pub per_page: u32,
22    pub pages: u32,
23    pub page: u32,
24    pub items: u32,
25    #[serde(default)]
26    pub urls: Option<PaginationUrls>,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct PaginationUrls {
31    #[serde(default)]
32    pub first: Option<String>,
33    #[serde(default)]
34    pub prev: Option<String>,
35    #[serde(default)]
36    pub next: Option<String>,
37    #[serde(default)]
38    pub last: Option<String>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct AboutStatistics {
43    pub releases: u64,
44    pub artists: u64,
45    pub labels: u64,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49pub struct AboutResponse {
50    pub hello: String,
51    pub api_version: String,
52    pub documentation_url: String,
53    pub statistics: AboutStatistics,
54    #[serde(flatten)]
55    pub extra: ExtraFields,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct Identity {
60    pub id: u64,
61    pub username: String,
62    pub resource_url: String,
63    #[serde(default)]
64    pub consumer_name: Option<String>,
65    #[serde(flatten)]
66    pub extra: ExtraFields,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct Image {
71    pub width: u32,
72    pub height: u32,
73    pub resource_url: String,
74    #[serde(rename = "type")]
75    pub image_type: String,
76    pub uri: String,
77    #[serde(default)]
78    pub uri150: Option<String>,
79    #[serde(flatten)]
80    pub extra: ExtraFields,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct UserReference {
85    #[serde(default)]
86    pub id: Option<u64>,
87    pub username: String,
88    pub resource_url: String,
89    #[serde(default)]
90    pub avatar_url: Option<String>,
91    #[serde(flatten)]
92    pub extra: ExtraFields,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct ArtistCredit {
97    #[serde(default)]
98    pub anv: Option<String>,
99    pub id: u64,
100    #[serde(default)]
101    pub join: Option<String>,
102    pub name: String,
103    pub resource_url: String,
104    #[serde(default)]
105    pub role: Option<String>,
106    #[serde(default)]
107    pub tracks: Option<String>,
108    #[serde(flatten)]
109    pub extra: ExtraFields,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct Format {
114    #[serde(default)]
115    pub qty: Option<String>,
116    pub name: String,
117    #[serde(default)]
118    pub descriptions: Option<Vec<String>>,
119    #[serde(flatten)]
120    pub extra: ExtraFields,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct LabelReference {
125    pub resource_url: String,
126    #[serde(default)]
127    pub entity_type: Option<String>,
128    #[serde(default)]
129    pub catno: Option<String>,
130    pub id: u64,
131    pub name: String,
132    #[serde(flatten)]
133    pub extra: ExtraFields,
134}
135
136#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct Track {
138    #[serde(default)]
139    pub duration: Option<String>,
140    #[serde(default)]
141    pub position: Option<String>,
142    pub title: String,
143    #[serde(rename = "type_", default)]
144    pub track_type: Option<String>,
145    #[serde(default)]
146    pub extraartists: Option<Vec<ArtistCredit>>,
147    #[serde(flatten)]
148    pub extra: ExtraFields,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152pub struct Video {
153    #[serde(default)]
154    pub description: Option<String>,
155    #[serde(default)]
156    pub duration: Option<u64>,
157    #[serde(default)]
158    pub embed: Option<bool>,
159    #[serde(default)]
160    pub title: Option<String>,
161    pub uri: String,
162    #[serde(flatten)]
163    pub extra: ExtraFields,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize)]
167pub struct ArtistMember {
168    pub active: bool,
169    pub id: u64,
170    pub name: String,
171    pub resource_url: String,
172    #[serde(flatten)]
173    pub extra: ExtraFields,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct Artist {
178    pub id: u64,
179    pub name: String,
180    #[serde(default)]
181    pub namevariations: Option<Vec<String>>,
182    #[serde(default)]
183    pub profile: Option<String>,
184    pub resource_url: String,
185    #[serde(default)]
186    pub releases_url: Option<String>,
187    #[serde(default)]
188    pub uri: Option<String>,
189    #[serde(default)]
190    pub urls: Option<Vec<String>>,
191    #[serde(default)]
192    pub data_quality: Option<String>,
193    #[serde(default)]
194    pub images: Option<Vec<Image>>,
195    #[serde(default)]
196    pub members: Option<Vec<ArtistMember>>,
197    #[serde(flatten)]
198    pub extra: ExtraFields,
199}
200
201#[derive(Debug, Clone, Serialize, Deserialize)]
202pub struct ArtistRelease {
203    #[serde(default)]
204    pub artist: Option<String>,
205    pub id: u64,
206    #[serde(default)]
207    pub main_release: Option<u64>,
208    pub resource_url: String,
209    #[serde(default)]
210    pub role: Option<String>,
211    #[serde(default)]
212    pub thumb: Option<String>,
213    pub title: String,
214    #[serde(default)]
215    pub r#type: Option<String>,
216    #[serde(default)]
217    pub year: Option<i32>,
218    #[serde(flatten)]
219    pub extra: ExtraFields,
220}
221
222#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct ArtistReleases {
224    pub releases: Vec<ArtistRelease>,
225    pub pagination: Pagination,
226    #[serde(flatten)]
227    pub extra: ExtraFields,
228}
229
230#[derive(Debug, Clone, Serialize, Deserialize)]
231pub struct ReleaseCommunityRatingSummary {
232    pub average: f64,
233    pub count: u64,
234}
235
236#[derive(Debug, Clone, Serialize, Deserialize)]
237pub struct ReleaseCommunity {
238    #[serde(default)]
239    pub contributors: Option<Vec<UserReference>>,
240    #[serde(default)]
241    pub data_quality: Option<String>,
242    #[serde(default)]
243    pub have: Option<u64>,
244    #[serde(default)]
245    pub rating: Option<ReleaseCommunityRatingSummary>,
246    #[serde(default)]
247    pub status: Option<DatabaseStatus>,
248    #[serde(default)]
249    pub submitter: Option<UserReference>,
250    #[serde(default)]
251    pub want: Option<u64>,
252    #[serde(flatten)]
253    pub extra: ExtraFields,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize)]
257pub struct ReleaseCompany {
258    #[serde(default)]
259    pub catno: Option<String>,
260    #[serde(default)]
261    pub entity_type: Option<String>,
262    #[serde(default)]
263    pub entity_type_name: Option<String>,
264    pub id: u64,
265    pub name: String,
266    pub resource_url: String,
267    #[serde(flatten)]
268    pub extra: ExtraFields,
269}
270
271#[derive(Debug, Clone, Serialize, Deserialize)]
272pub struct ReleaseIdentifier {
273    #[serde(rename = "type")]
274    pub id_type: String,
275    pub value: String,
276    #[serde(flatten)]
277    pub extra: ExtraFields,
278}
279
280#[derive(Debug, Clone, Serialize, Deserialize)]
281pub struct ReleaseSeries {
282    pub name: String,
283    #[serde(default)]
284    pub catno: Option<String>,
285    #[serde(default)]
286    pub entity_type: Option<String>,
287    #[serde(default)]
288    pub entity_type_name: Option<String>,
289    pub id: u64,
290    pub resource_url: String,
291    #[serde(default)]
292    pub thumbnail_url: Option<String>,
293    #[serde(flatten)]
294    pub extra: ExtraFields,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize)]
298pub struct Release {
299    pub id: u64,
300    pub title: String,
301    pub resource_url: String,
302    #[serde(default)]
303    pub uri: Option<String>,
304    #[serde(default)]
305    pub year: Option<i32>,
306    #[serde(default)]
307    pub artists: Option<Vec<ArtistCredit>>,
308    #[serde(default)]
309    pub data_quality: Option<String>,
310    #[serde(default)]
311    pub thumb: Option<String>,
312    #[serde(default)]
313    pub community: Option<ReleaseCommunity>,
314    #[serde(default)]
315    pub companies: Option<Vec<ReleaseCompany>>,
316    #[serde(default)]
317    pub country: Option<String>,
318    #[serde(default)]
319    pub date_added: Option<String>,
320    #[serde(default)]
321    pub date_changed: Option<String>,
322    #[serde(default)]
323    pub estimated_weight: Option<u64>,
324    #[serde(default)]
325    pub extraartists: Option<Vec<ArtistCredit>>,
326    #[serde(default)]
327    pub format_quantity: Option<u32>,
328    #[serde(default)]
329    pub formats: Option<Vec<Format>>,
330    #[serde(default)]
331    pub genres: Option<Vec<String>>,
332    #[serde(default)]
333    pub identifiers: Option<Vec<ReleaseIdentifier>>,
334    #[serde(default)]
335    pub images: Option<Vec<Image>>,
336    #[serde(default)]
337    pub labels: Option<Vec<LabelReference>>,
338    #[serde(default)]
339    pub lowest_price: Option<f64>,
340    #[serde(default)]
341    pub master_id: Option<u64>,
342    #[serde(default)]
343    pub master_url: Option<String>,
344    #[serde(default)]
345    pub notes: Option<String>,
346    #[serde(default)]
347    pub num_for_sale: Option<u64>,
348    #[serde(default)]
349    pub released: Option<String>,
350    #[serde(default)]
351    pub released_formatted: Option<String>,
352    #[serde(default)]
353    pub series: Option<Vec<ReleaseSeries>>,
354    #[serde(default)]
355    pub status: Option<DatabaseStatus>,
356    #[serde(default)]
357    pub styles: Option<Vec<String>>,
358    #[serde(default)]
359    pub tracklist: Option<Vec<Track>>,
360    #[serde(default)]
361    pub videos: Option<Vec<Video>>,
362    #[serde(flatten)]
363    pub extra: ExtraFields,
364}
365
366#[derive(Debug, Clone, Serialize, Deserialize)]
367pub struct ReleaseRating {
368    pub username: String,
369    pub release_id: u64,
370    pub rating: u8,
371    #[serde(flatten)]
372    pub extra: ExtraFields,
373}
374
375#[derive(Debug, Clone, Serialize, Deserialize)]
376pub struct RatingSummary {
377    pub average: f64,
378    pub count: u64,
379}
380
381#[derive(Debug, Clone, Serialize, Deserialize)]
382pub struct ReleaseCommunityRating {
383    pub release_id: u64,
384    pub rating: RatingSummary,
385    #[serde(flatten)]
386    pub extra: ExtraFields,
387}
388
389#[derive(Debug, Clone, Serialize, Deserialize)]
390pub struct ReleaseStats {
391    pub num_have: u64,
392    pub num_want: u64,
393    #[serde(flatten)]
394    pub extra: ExtraFields,
395}
396
397#[derive(Debug, Clone, Serialize, Deserialize)]
398pub struct Master {
399    pub id: u64,
400    pub title: String,
401    pub resource_url: String,
402    #[serde(default)]
403    pub main_release: Option<u64>,
404    #[serde(default)]
405    pub main_release_url: Option<String>,
406    #[serde(default)]
407    pub uri: Option<String>,
408    #[serde(default)]
409    pub artists: Option<Vec<ArtistCredit>>,
410    #[serde(default)]
411    pub versions_url: Option<String>,
412    #[serde(default)]
413    pub year: Option<i32>,
414    #[serde(default)]
415    pub images: Option<Vec<Image>>,
416    #[serde(default)]
417    pub tracklist: Option<Vec<Track>>,
418    #[serde(default)]
419    pub videos: Option<Vec<Video>>,
420    #[serde(default)]
421    pub genres: Option<Vec<String>>,
422    #[serde(default)]
423    pub styles: Option<Vec<String>>,
424    #[serde(default)]
425    pub num_for_sale: Option<u64>,
426    #[serde(default)]
427    pub lowest_price: Option<f64>,
428    #[serde(default)]
429    pub data_quality: Option<String>,
430    #[serde(flatten)]
431    pub extra: ExtraFields,
432}
433
434#[derive(Debug, Clone, Serialize, Deserialize)]
435pub struct CollectionStats {
436    pub in_collection: u64,
437    pub in_wantlist: u64,
438}
439
440#[derive(Debug, Clone, Serialize, Deserialize)]
441pub struct MasterVersionStats {
442    #[serde(default)]
443    pub user: Option<CollectionStats>,
444    #[serde(default)]
445    pub community: Option<CollectionStats>,
446}
447
448#[derive(Debug, Clone, Serialize, Deserialize)]
449pub struct MasterVersion {
450    #[serde(default)]
451    pub status: Option<DatabaseStatus>,
452    #[serde(default)]
453    pub stats: Option<MasterVersionStats>,
454    #[serde(default)]
455    pub thumb: Option<String>,
456    #[serde(default)]
457    pub format: Option<String>,
458    #[serde(default)]
459    pub country: Option<String>,
460    pub title: String,
461    #[serde(default)]
462    pub label: Option<String>,
463    #[serde(default)]
464    pub released: Option<String>,
465    #[serde(default)]
466    pub major_formats: Option<Vec<String>>,
467    #[serde(default)]
468    pub catno: Option<String>,
469    pub resource_url: String,
470    pub id: u64,
471    #[serde(flatten)]
472    pub extra: ExtraFields,
473}
474
475#[derive(Debug, Clone, Serialize, Deserialize)]
476pub struct MasterVersions {
477    pub versions: Vec<MasterVersion>,
478    pub pagination: Pagination,
479    #[serde(flatten)]
480    pub extra: ExtraFields,
481}
482
483#[derive(Debug, Clone, Serialize, Deserialize)]
484pub struct LabelShort {
485    pub resource_url: String,
486    pub id: u64,
487    pub name: String,
488    #[serde(flatten)]
489    pub extra: ExtraFields,
490}
491
492#[derive(Debug, Clone, Serialize, Deserialize)]
493pub struct Label {
494    pub id: u64,
495    pub name: String,
496    pub resource_url: String,
497    #[serde(default)]
498    pub uri: Option<String>,
499    #[serde(default)]
500    pub releases_url: Option<String>,
501    #[serde(default)]
502    pub profile: Option<String>,
503    #[serde(default)]
504    pub contact_info: Option<String>,
505    #[serde(default)]
506    pub urls: Option<Vec<String>>,
507    #[serde(default)]
508    pub images: Option<Vec<Image>>,
509    #[serde(default)]
510    pub sublabels: Option<Vec<LabelShort>>,
511    #[serde(default)]
512    pub data_quality: Option<String>,
513    #[serde(flatten)]
514    pub extra: ExtraFields,
515}
516
517#[derive(Debug, Clone, Serialize, Deserialize)]
518pub struct LabelRelease {
519    #[serde(default)]
520    pub artist: Option<String>,
521    #[serde(default)]
522    pub catno: Option<String>,
523    #[serde(default)]
524    pub format: Option<String>,
525    pub id: u64,
526    pub resource_url: String,
527    #[serde(default)]
528    pub status: Option<DatabaseStatus>,
529    #[serde(default)]
530    pub thumb: Option<String>,
531    pub title: String,
532    #[serde(default)]
533    pub year: Option<i32>,
534    #[serde(flatten)]
535    pub extra: ExtraFields,
536}
537
538#[derive(Debug, Clone, Serialize, Deserialize)]
539pub struct LabelReleases {
540    pub releases: Vec<LabelRelease>,
541    pub pagination: Pagination,
542    #[serde(flatten)]
543    pub extra: ExtraFields,
544}
545
546#[derive(Debug, Clone, Serialize, Deserialize)]
547pub struct SearchResultUserData {
548    #[serde(default)]
549    pub in_wantlist: Option<bool>,
550    #[serde(default)]
551    pub in_collection: Option<bool>,
552}
553
554#[derive(Debug, Clone, Serialize, Deserialize)]
555pub struct SearchResultCommunity {
556    #[serde(default)]
557    pub want: Option<u64>,
558    #[serde(default)]
559    pub have: Option<u64>,
560}
561
562#[derive(Debug, Clone, Serialize, Deserialize)]
563pub struct SearchResult {
564    pub id: u64,
565    #[serde(rename = "type")]
566    pub result_type: String,
567    #[serde(default)]
568    pub user_data: Option<SearchResultUserData>,
569    #[serde(default)]
570    pub master_id: Option<u64>,
571    #[serde(default)]
572    pub master_url: Option<String>,
573    pub uri: String,
574    pub title: String,
575    #[serde(default)]
576    pub thumb: Option<String>,
577    #[serde(default)]
578    pub cover_image: Option<String>,
579    pub resource_url: String,
580    #[serde(default)]
581    pub country: Option<String>,
582    #[serde(default)]
583    pub year: Option<String>,
584    #[serde(default)]
585    pub format: Option<Vec<String>>,
586    #[serde(default)]
587    pub label: Option<Vec<String>>,
588    #[serde(default)]
589    pub genre: Option<Vec<String>>,
590    #[serde(default)]
591    pub style: Option<Vec<String>>,
592    #[serde(default)]
593    pub barcode: Option<Vec<String>>,
594    #[serde(default)]
595    pub catno: Option<String>,
596    #[serde(default)]
597    pub community: Option<SearchResultCommunity>,
598    #[serde(default)]
599    pub format_quantity: Option<u32>,
600    #[serde(default)]
601    pub formats: Option<Vec<Format>>,
602    #[serde(flatten)]
603    pub extra: ExtraFields,
604}
605
606#[derive(Debug, Clone, Serialize, Deserialize)]
607pub struct SearchResults {
608    pub results: Vec<SearchResult>,
609    pub pagination: Pagination,
610    #[serde(flatten)]
611    pub extra: ExtraFields,
612}
613
614#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
615#[serde(rename_all = "UPPERCASE")]
616pub enum Currency {
617    Usd,
618    Gbp,
619    Eur,
620    Cad,
621    Aud,
622    Jpy,
623    Chf,
624    Mxn,
625    Brl,
626    Nzd,
627    Sek,
628    Zar,
629}
630
631impl Currency {
632    pub fn as_code(self) -> &'static str {
633        match self {
634            Currency::Usd => "USD",
635            Currency::Gbp => "GBP",
636            Currency::Eur => "EUR",
637            Currency::Cad => "CAD",
638            Currency::Aud => "AUD",
639            Currency::Jpy => "JPY",
640            Currency::Chf => "CHF",
641            Currency::Mxn => "MXN",
642            Currency::Brl => "BRL",
643            Currency::Nzd => "NZD",
644            Currency::Sek => "SEK",
645            Currency::Zar => "ZAR",
646        }
647    }
648}
649
650#[derive(Debug, Clone, Serialize, Deserialize)]
651pub struct Price {
652    #[serde(default)]
653    pub currency: Option<Currency>,
654    #[serde(default)]
655    pub value: Option<f64>,
656    #[serde(default)]
657    pub curr_abbr: Option<Currency>,
658    #[serde(default)]
659    pub curr_id: Option<u64>,
660    #[serde(default)]
661    pub formatted: Option<String>,
662    #[serde(flatten)]
663    pub extra: ExtraFields,
664}
665
666#[derive(Debug, Clone, Serialize, Deserialize)]
667pub struct ListingReleaseSummary {
668    #[serde(default)]
669    pub catalog_number: Option<String>,
670    pub resource_url: String,
671    #[serde(default)]
672    pub year: Option<i32>,
673    pub id: u64,
674    #[serde(default)]
675    pub description: Option<String>,
676    #[serde(default)]
677    pub images: Option<Vec<Image>>,
678    #[serde(default)]
679    pub artist: Option<String>,
680    pub title: String,
681    #[serde(default)]
682    pub format: Option<String>,
683    #[serde(default)]
684    pub thumbnail: Option<String>,
685    #[serde(flatten)]
686    pub extra: ExtraFields,
687}
688
689#[derive(Debug, Clone, Serialize, Deserialize)]
690pub struct Listing {
691    pub id: u64,
692    #[serde(default)]
693    pub status: Option<SaleStatus>,
694    #[serde(default)]
695    pub resource_url: Option<String>,
696    #[serde(default)]
697    pub uri: Option<String>,
698    #[serde(default)]
699    pub price: Option<Price>,
700    #[serde(default)]
701    pub sleeve_condition: Option<SleeveCondition>,
702    #[serde(default)]
703    pub condition: Option<MediaCondition>,
704    #[serde(default)]
705    pub posted: Option<String>,
706    #[serde(default)]
707    pub comments: Option<String>,
708    #[serde(default)]
709    pub allow_offers: Option<bool>,
710    #[serde(default)]
711    pub ships_from: Option<String>,
712    #[serde(default)]
713    pub audio: Option<bool>,
714    #[serde(default)]
715    pub release: Option<ListingReleaseSummary>,
716    #[serde(flatten)]
717    pub extra: ExtraFields,
718}
719
720#[derive(Debug, Clone, Serialize, Deserialize)]
721pub struct CreateListingResponse {
722    pub listing_id: u64,
723    pub resource_url: String,
724    #[serde(flatten)]
725    pub extra: ExtraFields,
726}
727
728#[derive(Debug, Clone, Serialize, Deserialize)]
729pub struct OrderItem {
730    #[serde(default)]
731    pub release: Option<ListingReleaseSummary>,
732    #[serde(default)]
733    pub price: Option<Price>,
734    #[serde(default)]
735    pub media_condition: Option<MediaCondition>,
736    #[serde(default)]
737    pub sleeve_condition: Option<SleeveCondition>,
738    pub id: u64,
739    #[serde(flatten)]
740    pub extra: ExtraFields,
741}
742
743#[derive(Debug, Clone, Serialize, Deserialize)]
744pub struct Order {
745    pub id: String,
746    pub resource_url: String,
747    #[serde(default)]
748    pub status: Option<OrderStatus>,
749    #[serde(default)]
750    pub messages_url: Option<String>,
751    #[serde(default)]
752    pub uri: Option<String>,
753    #[serde(default)]
754    pub fee: Option<Price>,
755    #[serde(default)]
756    pub created: Option<String>,
757    #[serde(default)]
758    pub items: Option<Vec<OrderItem>>,
759    #[serde(default)]
760    pub shipping_address: Option<String>,
761    #[serde(default)]
762    pub additional_instructions: Option<String>,
763    #[serde(default)]
764    pub archived: Option<bool>,
765    #[serde(default)]
766    pub seller: Option<UserReference>,
767    #[serde(default)]
768    pub last_activity: Option<String>,
769    #[serde(default)]
770    pub buyer: Option<UserReference>,
771    #[serde(default)]
772    pub total: Option<Price>,
773    #[serde(flatten)]
774    pub extra: ExtraFields,
775}
776
777#[derive(Debug, Clone, Serialize, Deserialize)]
778pub struct OrdersResponse {
779    pub orders: Vec<Order>,
780    pub pagination: Pagination,
781    #[serde(flatten)]
782    pub extra: ExtraFields,
783}
784
785#[derive(Debug, Clone, Serialize, Deserialize)]
786pub struct OrderMessage {
787    pub message: String,
788    #[serde(default)]
789    pub timestamp: Option<String>,
790    #[serde(default)]
791    pub subject: Option<String>,
792    #[serde(default)]
793    pub r#type: Option<String>,
794    #[serde(default)]
795    pub status_id: Option<u64>,
796    #[serde(flatten)]
797    pub extra: ExtraFields,
798}
799
800#[derive(Debug, Clone, Serialize, Deserialize)]
801pub struct OrderMessagesResponse {
802    pub messages: Vec<OrderMessage>,
803    pub pagination: Pagination,
804    #[serde(flatten)]
805    pub extra: ExtraFields,
806}
807
808#[derive(Debug, Clone, Serialize, Deserialize)]
809pub struct MarketplaceReleaseStats {
810    #[serde(default)]
811    pub lowest_price: Option<Price>,
812    #[serde(default)]
813    pub num_for_sale: Option<u64>,
814    #[serde(default)]
815    pub blocked_from_sale: Option<bool>,
816    #[serde(flatten)]
817    pub extra: ExtraFields,
818}
819
820#[derive(Debug, Clone, Serialize, Deserialize)]
821pub struct InventoryExport {
822    pub id: u64,
823    #[serde(default)]
824    pub status: Option<String>,
825    #[serde(default)]
826    pub created_ts: Option<String>,
827    #[serde(default)]
828    pub finished_ts: Option<String>,
829    #[serde(default)]
830    pub url: Option<String>,
831    #[serde(default)]
832    pub download_url: Option<String>,
833    #[serde(default)]
834    pub filename: Option<String>,
835    #[serde(flatten)]
836    pub extra: ExtraFields,
837}
838
839#[derive(Debug, Clone, Serialize, Deserialize)]
840pub struct InventoryExports {
841    pub items: Vec<InventoryExport>,
842    pub pagination: Pagination,
843    #[serde(flatten)]
844    pub extra: ExtraFields,
845}
846
847#[derive(Debug, Clone, Serialize, Deserialize)]
848pub struct UserListSummary {
849    pub id: u64,
850    pub name: String,
851    pub resource_url: String,
852    #[serde(default)]
853    pub uri: Option<String>,
854    #[serde(default)]
855    pub public: Option<bool>,
856    #[serde(default)]
857    pub description: Option<String>,
858    #[serde(default)]
859    pub date_added: Option<String>,
860    #[serde(default)]
861    pub date_changed: Option<String>,
862    #[serde(flatten)]
863    pub extra: ExtraFields,
864}
865
866#[derive(Debug, Clone, Serialize, Deserialize)]
867pub struct UserProfile {
868    pub id: u64,
869    pub username: String,
870    pub resource_url: String,
871    #[serde(default)]
872    pub curr_abbr: Option<Currency>,
873    #[serde(default)]
874    pub avatar_url: Option<String>,
875    #[serde(default)]
876    pub profile: Option<String>,
877    #[serde(default)]
878    pub name: Option<String>,
879    #[serde(default)]
880    pub home_page: Option<String>,
881    #[serde(default)]
882    pub location: Option<String>,
883    #[serde(default)]
884    pub email: Option<String>,
885    #[serde(default)]
886    pub num_collection: Option<u64>,
887    #[serde(default)]
888    pub num_wantlist: Option<u64>,
889    #[serde(default)]
890    pub num_for_sale: Option<u64>,
891    #[serde(default)]
892    pub num_lists: Option<u64>,
893    #[serde(default)]
894    pub registered: Option<String>,
895    #[serde(flatten)]
896    pub extra: ExtraFields,
897}
898
899#[derive(Debug, Clone, Serialize, Deserialize)]
900pub struct UserInventory {
901    pub listings: Vec<Listing>,
902    pub pagination: Pagination,
903    #[serde(flatten)]
904    pub extra: ExtraFields,
905}
906
907#[derive(Debug, Clone, Serialize, Deserialize)]
908pub struct UserContributions {
909    pub contributions: Vec<Release>,
910    pub pagination: Pagination,
911    #[serde(flatten)]
912    pub extra: ExtraFields,
913}
914
915#[derive(Debug, Clone, Serialize, Deserialize)]
916pub struct SubmissionArtist {
917    pub id: u64,
918    pub name: String,
919    pub resource_url: String,
920    #[serde(default)]
921    pub releases_url: Option<String>,
922    #[serde(default)]
923    pub uri: Option<String>,
924    #[serde(default)]
925    pub namevariations: Option<Vec<String>>,
926    #[serde(default)]
927    pub data_quality: Option<String>,
928    #[serde(flatten)]
929    pub extra: ExtraFields,
930}
931
932#[derive(Debug, Clone, Serialize, Deserialize)]
933pub struct UserSubmissionsPayload {
934    pub artists: Vec<SubmissionArtist>,
935    pub labels: Vec<Label>,
936    pub releases: Vec<Release>,
937    #[serde(flatten)]
938    pub extra: ExtraFields,
939}
940
941#[derive(Debug, Clone, Serialize, Deserialize)]
942pub struct UserSubmissions {
943    pub submissions: UserSubmissionsPayload,
944    pub pagination: Pagination,
945    #[serde(flatten)]
946    pub extra: ExtraFields,
947}
948
949#[derive(Debug, Clone, Serialize, Deserialize)]
950pub struct UserLists {
951    pub lists: Vec<UserListSummary>,
952    pub pagination: Pagination,
953    #[serde(flatten)]
954    pub extra: ExtraFields,
955}
956
957#[derive(Debug, Clone, Serialize, Deserialize)]
958pub struct CollectionFolder {
959    pub id: u64,
960    pub count: u64,
961    pub name: String,
962    pub resource_url: String,
963    #[serde(flatten)]
964    pub extra: ExtraFields,
965}
966
967#[derive(Debug, Clone, Serialize, Deserialize)]
968pub struct CollectionFolders {
969    pub folders: Vec<CollectionFolder>,
970    #[serde(flatten)]
971    pub extra: ExtraFields,
972}
973
974#[derive(Debug, Clone, Serialize, Deserialize)]
975pub struct BasicReleaseInfo {
976    pub id: u64,
977    pub title: String,
978    #[serde(default)]
979    pub year: Option<i32>,
980    pub resource_url: String,
981    #[serde(default)]
982    pub thumb: Option<String>,
983    #[serde(default)]
984    pub cover_image: Option<String>,
985    #[serde(default)]
986    pub formats: Option<Vec<Format>>,
987    #[serde(default)]
988    pub labels: Option<Vec<LabelReference>>,
989    #[serde(default)]
990    pub artists: Option<Vec<ArtistCredit>>,
991    #[serde(default)]
992    pub genres: Option<Vec<String>>,
993    #[serde(default)]
994    pub styles: Option<Vec<String>>,
995    #[serde(flatten)]
996    pub extra: ExtraFields,
997}
998
999#[derive(Debug, Clone, Serialize, Deserialize)]
1000pub struct CollectionNote {
1001    pub field_id: u64,
1002    pub value: String,
1003    #[serde(flatten)]
1004    pub extra: ExtraFields,
1005}
1006
1007#[derive(Debug, Clone, Serialize, Deserialize)]
1008pub struct CollectionRelease {
1009    pub id: u64,
1010    pub instance_id: u64,
1011    #[serde(default)]
1012    pub folder_id: Option<u64>,
1013    #[serde(default)]
1014    pub rating: Option<u8>,
1015    #[serde(default)]
1016    pub basic_information: Option<BasicReleaseInfo>,
1017    #[serde(default)]
1018    pub notes: Option<Vec<CollectionNote>>,
1019    #[serde(default)]
1020    pub date_added: Option<String>,
1021    #[serde(flatten)]
1022    pub extra: ExtraFields,
1023}
1024
1025#[derive(Debug, Clone, Serialize, Deserialize)]
1026pub struct CollectionReleases {
1027    pub releases: Vec<CollectionRelease>,
1028    pub pagination: Pagination,
1029    #[serde(flatten)]
1030    pub extra: ExtraFields,
1031}
1032
1033#[derive(Debug, Clone, Serialize, Deserialize)]
1034pub struct AddCollectionReleaseResponse {
1035    pub instance_id: u64,
1036    pub resource_url: String,
1037    #[serde(flatten)]
1038    pub extra: ExtraFields,
1039}
1040
1041#[derive(Debug, Clone, Serialize, Deserialize)]
1042pub struct CollectionField {
1043    pub id: u64,
1044    pub name: String,
1045    #[serde(rename = "type")]
1046    pub field_type: String,
1047    pub public: bool,
1048    pub position: u32,
1049    #[serde(default)]
1050    pub options: Option<Vec<String>>,
1051    #[serde(default)]
1052    pub lines: Option<u32>,
1053    #[serde(flatten)]
1054    pub extra: ExtraFields,
1055}
1056
1057#[derive(Debug, Clone, Serialize, Deserialize)]
1058pub struct CollectionFields {
1059    pub fields: Vec<CollectionField>,
1060    #[serde(flatten)]
1061    pub extra: ExtraFields,
1062}
1063
1064#[derive(Debug, Clone, Serialize, Deserialize)]
1065pub struct CollectionValue {
1066    pub minimum: String,
1067    pub median: String,
1068    pub maximum: String,
1069    #[serde(flatten)]
1070    pub extra: ExtraFields,
1071}
1072
1073#[derive(Debug, Clone, Serialize, Deserialize)]
1074pub struct WantlistBasicInformation {
1075    pub resource_url: String,
1076    pub id: u64,
1077    #[serde(default)]
1078    pub formats: Option<Vec<Format>>,
1079    #[serde(default)]
1080    pub thumb: Option<String>,
1081    #[serde(default)]
1082    pub cover_image: Option<String>,
1083    pub title: String,
1084    #[serde(default)]
1085    pub labels: Option<Vec<LabelReference>>,
1086    #[serde(default)]
1087    pub year: Option<i32>,
1088    #[serde(default)]
1089    pub artists: Option<Vec<ArtistCredit>>,
1090    #[serde(default)]
1091    pub genres: Option<Vec<String>>,
1092    #[serde(default)]
1093    pub styles: Option<Vec<String>>,
1094    #[serde(flatten)]
1095    pub extra: ExtraFields,
1096}
1097
1098#[derive(Debug, Clone, Serialize, Deserialize)]
1099pub struct WantlistEntry {
1100    pub id: u64,
1101    pub resource_url: String,
1102    #[serde(default)]
1103    pub notes: Option<String>,
1104    #[serde(default)]
1105    pub rating: Option<u8>,
1106    #[serde(default)]
1107    pub basic_information: Option<WantlistBasicInformation>,
1108    #[serde(flatten)]
1109    pub extra: ExtraFields,
1110}
1111
1112#[derive(Debug, Clone, Serialize, Deserialize)]
1113pub struct WantlistEntries {
1114    pub wants: Vec<WantlistEntry>,
1115    pub pagination: Pagination,
1116    #[serde(flatten)]
1117    pub extra: ExtraFields,
1118}
1119
1120#[derive(Debug, Clone, Serialize, Deserialize)]
1121pub struct DiscogsList {
1122    pub list_id: u64,
1123    pub name: String,
1124    pub resource_url: String,
1125    #[serde(default)]
1126    pub description: Option<String>,
1127    #[serde(default)]
1128    pub created_ts: Option<String>,
1129    #[serde(default)]
1130    pub modified_ts: Option<String>,
1131    #[serde(default)]
1132    pub url: Option<String>,
1133    #[serde(default)]
1134    pub public: Option<bool>,
1135    pub items: Vec<ListItem>,
1136    #[serde(flatten)]
1137    pub extra: ExtraFields,
1138}
1139
1140#[derive(Debug, Clone, Serialize, Deserialize)]
1141pub struct ListItem {
1142    pub id: u64,
1143    pub display_title: String,
1144    #[serde(default)]
1145    pub comment: Option<String>,
1146    #[serde(default)]
1147    pub uri: Option<String>,
1148    #[serde(default)]
1149    pub image_url: Option<String>,
1150    #[serde(default)]
1151    pub resource_url: Option<String>,
1152    #[serde(rename = "type", default)]
1153    pub item_type: Option<String>,
1154    #[serde(flatten)]
1155    pub extra: ExtraFields,
1156}
1157
1158#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1159pub struct PaginationParams {
1160    #[serde(skip_serializing_if = "Option::is_none")]
1161    pub page: Option<u32>,
1162    #[serde(skip_serializing_if = "Option::is_none")]
1163    pub per_page: Option<u32>,
1164}
1165
1166#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1167#[serde(rename_all = "lowercase")]
1168pub enum SortOrder {
1169    Asc,
1170    Desc,
1171}
1172
1173#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1174#[serde(rename_all = "lowercase")]
1175pub enum SearchType {
1176    Release,
1177    Master,
1178    Artist,
1179    Label,
1180}
1181
1182#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1183pub enum DatabaseStatus {
1184    Accepted,
1185    Draft,
1186    Deleted,
1187    Rejected,
1188}
1189
1190#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1191pub enum SaleStatus {
1192    Draft,
1193    #[serde(rename = "For Sale")]
1194    ForSale,
1195    Expired,
1196}
1197
1198#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1199pub enum MediaCondition {
1200    #[serde(rename = "Mint (M)")]
1201    Mint,
1202    #[serde(rename = "Near Mint (NM or M-)")]
1203    NearMint,
1204    #[serde(rename = "Very Good Plus (VG+)")]
1205    VeryGoodPlus,
1206    #[serde(rename = "Very Good (VG)")]
1207    VeryGood,
1208    #[serde(rename = "Good Plus (G+)")]
1209    GoodPlus,
1210    #[serde(rename = "Good (G)")]
1211    Good,
1212    #[serde(rename = "Fair (F)")]
1213    Fair,
1214    #[serde(rename = "Poor (P)")]
1215    Poor,
1216}
1217
1218#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1219pub enum SleeveCondition {
1220    #[serde(rename = "Mint (M)")]
1221    Mint,
1222    #[serde(rename = "Near Mint (NM or M-)")]
1223    NearMint,
1224    #[serde(rename = "Very Good Plus (VG+)")]
1225    VeryGoodPlus,
1226    #[serde(rename = "Very Good (VG)")]
1227    VeryGood,
1228    #[serde(rename = "Good Plus (G+)")]
1229    GoodPlus,
1230    #[serde(rename = "Good (G)")]
1231    Good,
1232    #[serde(rename = "Fair (F)")]
1233    Fair,
1234    #[serde(rename = "Poor (P)")]
1235    Poor,
1236    Generic,
1237    #[serde(rename = "Not Graded")]
1238    NotGraded,
1239    #[serde(rename = "No Cover")]
1240    NoCover,
1241}
1242
1243#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
1244pub enum OrderStatus {
1245    #[serde(rename = "New Order")]
1246    NewOrder,
1247    #[serde(rename = "Buyer Contacted")]
1248    BuyerContacted,
1249    #[serde(rename = "Invoice Sent")]
1250    InvoiceSent,
1251    #[serde(rename = "Payment Pending")]
1252    PaymentPending,
1253    #[serde(rename = "Payment Received")]
1254    PaymentReceived,
1255    Shipped,
1256    #[serde(rename = "Refund Sent")]
1257    RefundSent,
1258    #[serde(rename = "Cancelled (Non-Paying Buyer)")]
1259    CancelledNonPayingBuyer,
1260    #[serde(rename = "Cancelled (Item Unavailable)")]
1261    CancelledItemUnavailable,
1262    #[serde(rename = "Cancelled (Per Buyer's Request)")]
1263    CancelledByBuyerRequest,
1264}
1265
1266#[derive(Debug, Clone, Serialize, Deserialize)]
1267#[serde(untagged)]
1268pub enum NumberOrAuto {
1269    Number(u32),
1270    Auto(String),
1271}
1272
1273#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1274pub struct ArtistReleasesQuery {
1275    #[serde(flatten)]
1276    pub pagination: PaginationParams,
1277    #[serde(skip_serializing_if = "Option::is_none")]
1278    pub sort: Option<String>,
1279    #[serde(skip_serializing_if = "Option::is_none")]
1280    pub sort_order: Option<SortOrder>,
1281}
1282
1283#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1284pub struct MasterVersionsQuery {
1285    #[serde(flatten)]
1286    pub pagination: PaginationParams,
1287    #[serde(skip_serializing_if = "Option::is_none")]
1288    pub format: Option<String>,
1289    #[serde(skip_serializing_if = "Option::is_none")]
1290    pub label: Option<String>,
1291    #[serde(skip_serializing_if = "Option::is_none")]
1292    pub released: Option<String>,
1293    #[serde(skip_serializing_if = "Option::is_none")]
1294    pub country: Option<String>,
1295    #[serde(skip_serializing_if = "Option::is_none")]
1296    pub sort: Option<String>,
1297    #[serde(skip_serializing_if = "Option::is_none")]
1298    pub sort_order: Option<SortOrder>,
1299}
1300
1301#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1302pub struct SearchQuery {
1303    #[serde(rename = "q", skip_serializing_if = "Option::is_none")]
1304    pub query: Option<String>,
1305    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
1306    pub query_type: Option<SearchType>,
1307    #[serde(skip_serializing_if = "Option::is_none")]
1308    pub title: Option<String>,
1309    #[serde(skip_serializing_if = "Option::is_none")]
1310    pub release_title: Option<String>,
1311    #[serde(skip_serializing_if = "Option::is_none")]
1312    pub credit: Option<String>,
1313    #[serde(skip_serializing_if = "Option::is_none")]
1314    pub artist: Option<String>,
1315    #[serde(skip_serializing_if = "Option::is_none")]
1316    pub anv: Option<String>,
1317    #[serde(skip_serializing_if = "Option::is_none")]
1318    pub label: Option<String>,
1319    #[serde(skip_serializing_if = "Option::is_none")]
1320    pub genre: Option<String>,
1321    #[serde(skip_serializing_if = "Option::is_none")]
1322    pub style: Option<String>,
1323    #[serde(skip_serializing_if = "Option::is_none")]
1324    pub country: Option<String>,
1325    #[serde(skip_serializing_if = "Option::is_none")]
1326    pub year: Option<String>,
1327    #[serde(skip_serializing_if = "Option::is_none")]
1328    pub format: Option<String>,
1329    #[serde(skip_serializing_if = "Option::is_none")]
1330    pub catno: Option<String>,
1331    #[serde(skip_serializing_if = "Option::is_none")]
1332    pub barcode: Option<String>,
1333    #[serde(skip_serializing_if = "Option::is_none")]
1334    pub track: Option<String>,
1335    #[serde(skip_serializing_if = "Option::is_none")]
1336    pub submitter: Option<String>,
1337    #[serde(skip_serializing_if = "Option::is_none")]
1338    pub contributor: Option<String>,
1339    #[serde(flatten)]
1340    pub pagination: PaginationParams,
1341}
1342
1343#[derive(Debug, Clone, Serialize, Deserialize)]
1344pub struct CreateListingRequest {
1345    pub release_id: u64,
1346    pub condition: MediaCondition,
1347    pub price: f64,
1348    pub status: SaleStatus,
1349    #[serde(skip_serializing_if = "Option::is_none")]
1350    pub sleeve_condition: Option<SleeveCondition>,
1351    #[serde(skip_serializing_if = "Option::is_none")]
1352    pub comments: Option<String>,
1353    #[serde(skip_serializing_if = "Option::is_none")]
1354    pub allow_offers: Option<bool>,
1355    #[serde(skip_serializing_if = "Option::is_none")]
1356    pub external_id: Option<String>,
1357    #[serde(skip_serializing_if = "Option::is_none")]
1358    pub location: Option<String>,
1359    #[serde(skip_serializing_if = "Option::is_none")]
1360    pub weight: Option<NumberOrAuto>,
1361    #[serde(skip_serializing_if = "Option::is_none")]
1362    pub format_quantity: Option<NumberOrAuto>,
1363}
1364
1365#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1366pub struct OrdersQuery {
1367    #[serde(skip_serializing_if = "Option::is_none")]
1368    pub status: Option<OrderStatus>,
1369    #[serde(skip_serializing_if = "Option::is_none")]
1370    pub created_after: Option<String>,
1371    #[serde(skip_serializing_if = "Option::is_none")]
1372    pub created_before: Option<String>,
1373    #[serde(skip_serializing_if = "Option::is_none")]
1374    pub archived: Option<bool>,
1375    #[serde(flatten)]
1376    pub pagination: PaginationParams,
1377    #[serde(skip_serializing_if = "Option::is_none")]
1378    pub sort: Option<String>,
1379    #[serde(skip_serializing_if = "Option::is_none")]
1380    pub sort_order: Option<SortOrder>,
1381}
1382
1383#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1384pub struct EditOrderRequest {
1385    #[serde(skip_serializing_if = "Option::is_none")]
1386    pub status: Option<OrderStatus>,
1387    #[serde(skip_serializing_if = "Option::is_none")]
1388    pub shipping: Option<f64>,
1389}
1390
1391#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1392pub struct AddOrderMessageRequest {
1393    #[serde(skip_serializing_if = "Option::is_none")]
1394    pub message: Option<String>,
1395    #[serde(skip_serializing_if = "Option::is_none")]
1396    pub status: Option<OrderStatus>,
1397}
1398
1399#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1400pub struct EditProfileRequest {
1401    #[serde(skip_serializing_if = "Option::is_none")]
1402    pub name: Option<String>,
1403    #[serde(skip_serializing_if = "Option::is_none")]
1404    pub home_page: Option<String>,
1405    #[serde(skip_serializing_if = "Option::is_none")]
1406    pub location: Option<String>,
1407    #[serde(skip_serializing_if = "Option::is_none")]
1408    pub profile: Option<String>,
1409    #[serde(skip_serializing_if = "Option::is_none")]
1410    pub curr_abbr: Option<Currency>,
1411}
1412
1413#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1414pub struct UserInventoryQuery {
1415    #[serde(skip_serializing_if = "Option::is_none")]
1416    pub status: Option<String>,
1417    #[serde(flatten)]
1418    pub pagination: PaginationParams,
1419    #[serde(skip_serializing_if = "Option::is_none")]
1420    pub sort: Option<String>,
1421    #[serde(skip_serializing_if = "Option::is_none")]
1422    pub sort_order: Option<SortOrder>,
1423}
1424
1425#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1426pub struct UserContributionsQuery {
1427    #[serde(flatten)]
1428    pub pagination: PaginationParams,
1429    #[serde(skip_serializing_if = "Option::is_none")]
1430    pub sort: Option<String>,
1431    #[serde(skip_serializing_if = "Option::is_none")]
1432    pub sort_order: Option<SortOrder>,
1433}
1434
1435#[derive(Debug, Clone, Serialize, Deserialize)]
1436pub struct AddFolderRequest {
1437    pub name: String,
1438}
1439
1440#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1441pub struct CollectionReleasesQuery {
1442    #[serde(flatten)]
1443    pub pagination: PaginationParams,
1444    #[serde(skip_serializing_if = "Option::is_none")]
1445    pub sort: Option<String>,
1446    #[serde(skip_serializing_if = "Option::is_none")]
1447    pub sort_order: Option<SortOrder>,
1448}
1449
1450#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1451pub struct EditCollectionReleaseRequest {
1452    #[serde(skip_serializing_if = "Option::is_none")]
1453    pub rating: Option<u8>,
1454    #[serde(skip_serializing_if = "Option::is_none")]
1455    pub folder_id: Option<u64>,
1456}
1457
1458#[derive(Debug, Clone, Serialize, Deserialize)]
1459pub struct EditInstanceNoteRequest {
1460    pub value: String,
1461}
1462
1463#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1464pub struct WantlistUpdateRequest {
1465    #[serde(skip_serializing_if = "Option::is_none")]
1466    pub notes: Option<String>,
1467    #[serde(skip_serializing_if = "Option::is_none")]
1468    pub rating: Option<u8>,
1469}