discogs_api/endpoints/
artist_releases.rs1use 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 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 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}