rspotify_model/
album.rs

1//! All objects related to album defined by Spotify API
2
3use chrono::prelude::*;
4use serde::{Deserialize, Serialize};
5
6use std::collections::HashMap;
7
8use crate::{
9    AlbumId, AlbumType, Copyright, DatePrecision, Image, Page, RestrictionReason, SimplifiedArtist,
10    SimplifiedTrack,
11};
12
13/// Simplified Album Object
14#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
15pub struct SimplifiedAlbum {
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub album_group: Option<String>,
18    pub album_type: Option<String>,
19    pub artists: Vec<SimplifiedArtist>,
20    #[serde(skip_serializing_if = "Vec::is_empty", default)]
21    pub available_markets: Vec<String>,
22    pub external_urls: HashMap<String, String>,
23    pub href: Option<String>,
24    pub id: Option<AlbumId<'static>>,
25    pub images: Vec<Image>,
26    pub name: String,
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub release_date: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub release_date_precision: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub restrictions: Option<Restriction>,
33}
34
35/// Full Album Object
36#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
37pub struct FullAlbum {
38    pub artists: Vec<SimplifiedArtist>,
39    pub album_type: AlbumType,
40    pub available_markets: Option<Vec<String>>,
41    pub copyrights: Vec<Copyright>,
42    pub external_ids: HashMap<String, String>,
43    pub external_urls: HashMap<String, String>,
44    pub genres: Vec<String>,
45    pub href: String,
46    pub id: AlbumId<'static>,
47    pub images: Vec<Image>,
48    pub name: String,
49    pub popularity: u32,
50    pub release_date: String,
51    pub release_date_precision: DatePrecision,
52    pub tracks: Page<SimplifiedTrack>,
53    /// Not documented in official Spotify docs, however most albums do contain this field
54    pub label: Option<String>,
55}
56
57/// Intermediate full Albums wrapped by Vec object
58#[derive(Deserialize)]
59pub struct FullAlbums {
60    pub albums: Vec<FullAlbum>,
61}
62
63/// Intermediate simplified Albums wrapped by Page object
64#[derive(Deserialize)]
65pub struct PageSimplifiedAlbums {
66    pub albums: Page<SimplifiedAlbum>,
67}
68
69/// Saved Album object
70#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
71pub struct SavedAlbum {
72    pub added_at: DateTime<Utc>,
73    pub album: FullAlbum,
74}
75
76/// Album restriction object
77#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
78pub struct Restriction {
79    pub reason: RestrictionReason,
80}