1pub mod album;
5pub mod artist;
6pub mod audio;
7pub mod auth;
8pub mod category;
9pub mod context;
10pub(crate) mod custom_serde;
11pub mod device;
12pub mod enums;
13pub mod error;
14pub mod idtypes;
15pub mod image;
16pub mod offset;
17pub mod page;
18pub mod playing;
19pub mod playlist;
20pub mod recommend;
21pub mod search;
22pub mod show;
23pub mod track;
24pub mod user;
25
26pub use {
27 album::*, artist::*, audio::*, auth::*, category::*, context::*, device::*, enums::*, error::*,
28 idtypes::*, image::*, offset::*, page::*, playing::*, playlist::*, recommend::*, search::*,
29 show::*, track::*, user::*,
30};
31
32use serde::{Deserialize, Serialize};
33
34#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)]
36pub struct Followers {
37 pub total: u32,
40}
41
42#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
44#[serde(untagged)]
45pub enum PlayableItem {
46 Track(track::FullTrack),
47 Episode(show::FullEpisode),
48}
49
50impl PlayableItem {
51 #[must_use]
56 pub fn id(&self) -> Option<PlayableId<'_>> {
57 match self {
58 PlayableItem::Track(t) => t.id.as_ref().map(|t| PlayableId::Track(t.as_ref())),
59 PlayableItem::Episode(e) => Some(PlayableId::Episode(e.id.as_ref())),
60 }
61 }
62}
63
64#[cfg(test)]
65mod tests {
66 use super::*;
67
68 #[test]
69 fn test_get_id() {
70 let artist_id = "spotify:artist:2WX2uTcsvV5OnS0inACecP";
72 let id = ArtistId::from_id_or_uri(artist_id).unwrap();
73 assert_eq!("2WX2uTcsvV5OnS0inACecP", id.id());
74
75 let album_id_a = "spotify/album/2WX2uTcsvV5OnS0inACecP";
77 assert_eq!(
78 "2WX2uTcsvV5OnS0inACecP",
79 AlbumId::from_id_or_uri(album_id_a).unwrap().id()
80 );
81
82 assert_eq!(
84 Err(IdError::InvalidType),
85 ArtistId::from_id_or_uri(album_id_a)
86 );
87
88 let artist_id_c = "spotify-album-2WX2uTcsvV5OnS0inACecP";
90 assert_eq!(
91 Err(IdError::InvalidId),
92 ArtistId::from_id_or_uri(artist_id_c)
93 );
94
95 let playlist_id = "spotify:playlist:59ZbFPES4DQwEjBpWHzrtC";
96 assert_eq!(
97 "59ZbFPES4DQwEjBpWHzrtC",
98 PlaylistId::from_id_or_uri(playlist_id).unwrap().id()
99 );
100 }
101
102 #[test]
103 fn test_get_uri() {
104 let track_id1 = "spotify:track:4iV5W9uYEdYUVa79Axb7Rh";
105 let track_id2 = "1301WleyT98MSxVHPZCA6M";
106 let id1 = TrackId::from_id_or_uri(track_id1).unwrap();
107 let id2 = TrackId::from_id_or_uri(track_id2).unwrap();
108 assert_eq!(track_id1, &id1.uri());
109 assert_eq!("spotify:track:1301WleyT98MSxVHPZCA6M", &id2.uri());
110 }
111}