discogs_api/endpoints/
master_versions.rs

1use 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    /// Filter by format, e.g. "Vinyl"
13    pub format: Option<String>,
14    /// Filter by label
15    pub label: Option<String>,
16    /// Filter by year released,
17    pub released: Option<u16>,
18    /// Filter by country of release
19    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}