discogs_api/endpoints/
artist_releases.rs

1use super::Endpoint;
2use crate::{data_types::SortOrder, Error};
3
4pub struct ArtistReleases;
5
6#[derive(Debug, Clone, Default)]
7pub struct ArtistReleasesParams {
8    pub artist_id: isize,
9    /// Seemes to be `year`, `title`, or `format`
10    pub sort: Option<String>,
11    pub sort_order: Option<SortOrder>,
12}
13
14impl Endpoint<'_> for ArtistReleases {
15    type Parameters = ArtistReleasesParams;
16    type ReturnType = crate::data_types::ArtistReleases;
17
18    fn build_url(
19        base: &reqwest::Url,
20        params: Self::Parameters,
21    ) -> Result<reqwest::Url, crate::Error> {
22        let mut out = base
23            .join(&format!("/artists/{}/releases", params.artist_id))
24            .map_err(|_| Error::UrlError)?;
25
26        // idk if preallocating is better here
27        // i also tried a match stmt over a tuple of the two options
28        // seems trivially different, but could be interesting to measure
29        let mut pairs = Vec::with_capacity(
30            usize::from(params.sort.is_some()) + usize::from(params.sort_order.is_some()),
31        );
32        if let Some(sort) = params.sort.as_deref() {
33            pairs.push(("sort", sort));
34        }
35        if let Some(sort_order) = params.sort_order.as_ref() {
36            pairs.push(("sort_order", sort_order.as_ref()));
37        }
38        out.query_pairs_mut().extend_pairs(pairs);
39
40        Ok(out)
41    }
42}
43
44#[cfg(test)]
45pub mod tests {
46    use super::*;
47    use crate::prelude::*;
48
49    #[test]
50    fn basic() {
51        let artist_id = 3946211;
52        let params = ArtistReleasesParams {
53            artist_id,
54            ..Default::default()
55        };
56
57        let client = Client::default();
58        let data = client.get::<ArtistReleases>(params).unwrap();
59
60        assert_eq!(data.pagination.page, 1);
61        assert!(!data.releases.is_empty());
62        assert!(!data.releases[0].title.is_empty());
63    }
64
65    #[test]
66    fn with_auth() {
67        let artist_id = 2445772;
68        let params = ArtistReleasesParams {
69            artist_id,
70            ..Default::default()
71        };
72        let pat = std::env::var("discogs-pat")
73            .expect("expected personal access token in env var `discogs-pat`");
74
75        let client = Client::builder().auth(Auth::Token(pat)).build().unwrap();
76        let data = client.get::<ArtistReleases>(params).unwrap();
77
78        assert!(!data.releases[0].thumb.is_empty());
79        assert!(data.releases[0].stats.is_some());
80    }
81}