use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use spotify_rs_macros::docs;
use super::{artist::SimplifiedArtist, track::SimplifiedTrack, *};
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs]
pub struct Album {
pub album_type: AlbumType,
pub total_tracks: u32,
#[serde(default)]
pub available_markets: Vec<String>,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub name: String,
pub release_date: String,
pub release_date_precision: DatePrecision,
pub r#type: String,
pub uri: String,
pub copyrights: Vec<Copyright>,
pub external_ids: ExternalIds,
pub genres: Vec<String>,
pub label: String,
pub popularity: u32,
pub artists: Vec<SimplifiedArtist>,
pub tracks: Page<SimplifiedTrack>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[docs(name = "album")]
pub struct SimplifiedAlbum {
pub album_type: AlbumType,
pub total_tracks: u32,
#[serde(default)]
pub available_markets: Vec<String>,
pub external_urls: ExternalUrls,
pub href: String,
pub id: String,
pub images: Vec<Image>,
pub name: String,
pub release_date: String,
pub release_date_precision: DatePrecision,
pub restrictions: Option<Restriction>,
pub r#type: String,
pub uri: String,
pub album_group: Option<AlbumGroup>,
pub artists: Vec<SimplifiedArtist>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub struct SavedAlbum {
pub added_at: DateTime<Utc>,
pub album: Album,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub(crate) struct Albums {
pub(crate) albums: Vec<Album>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
pub(crate) struct PagedAlbums {
pub(crate) albums: Page<SimplifiedAlbum>,
}
#[derive(Clone, Debug, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum AlbumType {
#[serde(alias = "ALBUM")]
Album,
#[serde(alias = "SINGLE")]
Single,
#[serde(alias = "COMPILATION")]
Compilation,
#[serde(alias = "EP")]
Ep,
#[serde(untagged)]
Unknown(String),
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AlbumGroup {
Album,
Single,
Compilation,
AppearsOn,
}
#[doc(hidden)]
impl AsRef<str> for AlbumGroup {
fn as_ref(&self) -> &str {
match self {
AlbumGroup::Album => "album",
AlbumGroup::Single => "single",
AlbumGroup::Compilation => "compilation",
AlbumGroup::AppearsOn => "appears_on",
}
}
}