//! All kinds of playlists objects use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use crate::{Followers, Image, Page, PlayableItem, PlaylistId, PublicUser}; /// Playlist result object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)] pub struct PlaylistResult { pub snapshot_id: String, } /// Playlist Track Reference Object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)] pub struct PlaylistTracksRef { pub href: String, pub total: u32, } fn deserialize_null_default<'de, D, T>(deserializer: D) -> Result where T: Default + serde::Deserialize<'de>, D: serde::Deserializer<'de>, { Ok(Option::deserialize(deserializer)?.unwrap_or_default()) } /// Simplified playlist object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct SimplifiedPlaylist { pub collaborative: bool, pub href: String, pub id: PlaylistId<'static>, #[serde(deserialize_with = "deserialize_null_default")] pub images: Vec, pub name: String, pub owner: PublicUser, pub public: Option, pub snapshot_id: String, pub tracks: PlaylistTracksRef, } /// Full playlist object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct FullPlaylist { pub collaborative: bool, pub description: Option, pub followers: Followers, pub href: String, pub id: PlaylistId<'static>, pub images: Vec, pub name: String, pub owner: PublicUser, pub public: Option, pub snapshot_id: String, pub tracks: Page, } /// Playlist track object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default)] pub struct PlaylistItem { #[serde(default, with = "time::serde::iso8601::option")] pub added_at: Option, pub added_by: Option, pub is_local: bool, pub track: Option, } /// Featured playlists object #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] pub struct FeaturedPlaylists { pub message: String, pub playlists: Page, } /// Intermediate category playlists object wrapped by `Page` #[derive(Deserialize)] pub struct CategoryPlaylists { pub playlists: Page, }