use educe::Educe;
use serde::{Deserialize, Serialize};
use url::Url;
use super::*;
use crate::data::option::impl_has_options;
use crate::data::source::SourceId;
id_type! {
pub struct QueueId(pub u64);
}
#[derive(Deserialize, Serialize, Educe, Clone)]
#[educe(Debug)]
pub struct QueuedTrackInfo {
pub song: String,
pub album: String,
pub artist: String,
#[educe(Debug(method(super::maybe_url::fmt)))]
#[serde(with = "super::maybe_url")]
pub image_url: Option<Url>,
#[serde(rename = "mid")]
pub media_id: String,
#[serde(rename = "qid")]
pub queue_id: QueueId,
#[serde(skip_serializing_if = "Option::is_none")]
pub album_id: Option<String>,
}
impl_try_from_response_payload!(QueuedTrackInfo);
impl_try_from_response_payload!(Vec<QueuedTrackInfo>);
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum NowPlayingInfo {
#[serde(rename = "song")]
Song {
#[serde(flatten)]
info: QueuedTrackInfo,
#[serde(rename = "sid")]
source_id: SourceId,
},
#[serde(rename = "station")]
Station {
#[serde(flatten)]
info: QueuedTrackInfo,
station: String,
#[serde(rename = "sid")]
source_id: SourceId,
}
}
impl_has_options!(NowPlayingInfo, "play");
impl_try_from_response_payload!(NowPlayingInfo);