use serde::Deserialize;
#[derive(Clone, Debug, Deserialize)]
pub struct ApiResponse<T> {
pub code: u16,
#[serde(flatten)]
pub body: T,
}
impl<T> ApiResponse<T> {
pub const fn is_success(&self) -> bool {
self.code == 200
}
}
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct TrackId(pub u64);
#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UserId(pub u64);
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Artist {
pub id: u64,
#[serde(default)]
pub name: String,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Album {
pub id: u64,
#[serde(default)]
pub name: String,
#[serde(default)]
pub pic_url: String,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Track {
pub id: u64,
#[serde(default)]
pub name: String,
#[serde(default, alias = "ar")]
pub artists: Vec<Artist>,
#[serde(default, alias = "al")]
pub album: Album,
#[serde(default, alias = "dt")]
pub duration: u32,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
pub struct SearchBody {
#[serde(default)]
pub result: SearchResults,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct SearchResults {
#[serde(default)]
pub songs: Vec<Track>,
#[serde(default)]
pub has_more: bool,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
pub struct TrackDetailsBody {
#[serde(default)]
pub songs: Vec<Track>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct StreamUrl {
pub id: u64,
pub url: Option<String>,
#[serde(default)]
pub br: u32,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq)]
pub struct StreamUrlsBody {
#[serde(default)]
pub data: Vec<StreamUrl>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct UserProfile {
pub user_id: u64,
#[serde(default)]
pub nickname: String,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct AccountBody {
pub profile: Option<UserProfile>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct UserDetailsBody {
pub profile: Option<UserProfile>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct Playlist {
pub id: u64,
#[serde(default)]
pub name: String,
pub description: Option<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)]
pub struct UserPlaylistsBody {
#[serde(default)]
pub playlist: Vec<Playlist>,
}