discogs_api/endpoints/
master_versions.rs1use super::Endpoint;
2use crate::{client::build_params, data_types::SortOrder, Error};
3use reqwest::Url;
4
5pub struct MasterVersions;
6
7#[derive(Debug, Clone, Default)]
8pub struct MasterVersionsParams {
9 pub master_id: isize,
10 pub page: Option<usize>,
11 pub per_page: Option<usize>,
12 pub format: Option<String>,
14 pub label: Option<String>,
16 pub released: Option<u16>,
18 pub country: Option<String>,
20 pub sort: Option<MasterVersionsSort>,
21 pub sort_order: Option<SortOrder>,
22}
23
24#[derive(Debug, Clone)]
25pub enum MasterVersionsSort {
26 Released,
27 Title,
28 Format,
29 Label,
30 CatNo,
31 Country,
32}
33
34impl AsRef<str> for MasterVersionsSort {
35 fn as_ref(&self) -> &str {
36 match self {
37 Self::Released => "released",
38 Self::Title => "title",
39 Self::Format => "format",
40 Self::Label => "label",
41 Self::CatNo => "catno",
42 Self::Country => "country",
43 }
44 }
45}
46
47impl MasterVersionsParams {
48 fn build(&self, personal_access_token: Option<&str>) -> String {
49 let mut params = Vec::with_capacity(9);
50 let page_owned: String;
51 let per_page_owned: String;
52 let released_owned: String;
53
54 if let Some(page) = self.page {
55 page_owned = page.to_string();
56 params.push(("page", page_owned.as_str()));
57 }
58 if let Some(per_page) = self.per_page {
59 per_page_owned = per_page.to_string();
60 params.push(("per_page", per_page_owned.as_str()));
61 }
62 if let Some(format) = self.format.as_deref() {
63 params.push(("format", format));
64 }
65 if let Some(label) = self.label.as_deref() {
66 params.push(("label", label));
67 }
68 if let Some(released) = self.released {
69 released_owned = released.to_string();
70 params.push(("released", &released_owned));
71 }
72 if let Some(country) = self.country.as_deref() {
73 params.push(("country", country));
74 }
75 if let Some(sort) = self.sort.as_ref().map(AsRef::as_ref) {
76 params.push(("sort", sort));
77 }
78 if let Some(sort_order) = self.sort_order.as_ref().map(AsRef::as_ref) {
79 params.push(("sort_order", sort_order));
80 }
81 if let Some(personal_access_token) = personal_access_token {
82 params.push(("token", personal_access_token));
83 }
84
85 build_params(params.as_slice())
86 }
87}
88
89impl Endpoint<'_> for MasterVersions {
90 type Parameters = MasterVersionsParams;
91 type ReturnType = crate::data_types::MasterVersions;
92
93 fn build_url(base: &Url, params: Self::Parameters) -> Result<Url, Error> {
94 base.join(&format!(
95 "/masters/{0}/versions{1}",
96 params.master_id,
97 params.build(None)
98 ))
99 .map_err(|_| Error::UrlError)
100 }
101}
102
103#[cfg(test)]
104mod tests {
105 use crate::{Auth, Client};
106
107 use super::*;
108
109 const ID: isize = 3175560;
110
111 #[test]
112 fn basic() {
113 let _data = Client::builder()
114 .build()
115 .unwrap()
116 .get::<MasterVersions>(MasterVersionsParams {
117 master_id: ID,
118 ..Default::default()
119 })
120 .unwrap();
121 }
122
123 #[test]
124 fn with_auth() {
125 let pat = std::env::var("discogs-pat")
126 .expect("expected personal access token in env var `discogs-pat`");
127 let _data = Client::builder()
128 .auth(Auth::Token(pat))
129 .build()
130 .unwrap()
131 .get::<MasterVersions>(MasterVersionsParams {
132 master_id: ID,
133 page: Some(2),
134 per_page: Some(2),
135 ..Default::default()
136 })
137 .unwrap();
138 }
139}