use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::library::{Id, artist::Artist, image_art::ImageArt, track::Track};
#[cfg(feature = "database-impls")]
pub mod database_impls;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Album {
pub title: String,
pub art: Option<Id<ImageArt>>,
pub tracks: Vec<TrackReference>,
pub artists: Vec<Id<Artist>>,
pub disc_total: Option<u32>,
pub genre: Vec<String>,
pub track_total: Option<u32>,
pub date: Option<DateTime<Utc>>,
}
impl Album {
pub const UNKNOWN: &str = "UNKNOWN ALBUM";
}
impl Album {
pub(crate) fn new(name: String, artists: Vec<Id<Artist>>, tracks: Vec<TrackReference>) -> Self {
Self {
artists,
art: None,
disc_total: None,
genre: Vec::new(),
title: name,
track_total: None,
date: None,
tracks,
}
}
}
impl Album {
#[must_use]
pub fn name(&self) -> &str {
&self.title
}
#[must_use]
pub fn artists(&self) -> &[Id<Artist>] {
&self.artists
}
#[must_use]
pub fn track_refs(&self) -> &[TrackReference] {
&self.tracks
}
#[must_use]
pub fn tracks(&self) -> impl Iterator<Item = Id<Track>> {
self.tracks.iter().map(|i| i.id)
}
}
#[derive(Debug, Deserialize, Serialize, Clone, Copy)]
pub struct TrackReference {
pub id: Id<Track>,
pub track_num: Option<u32>,
pub disc_num: Option<u32>,
}
impl std::ops::Deref for TrackReference {
type Target = Id<Track>;
fn deref(&self) -> &Self::Target {
&self.id
}
}
impl PartialEq for TrackReference {
fn eq(&self, other: &Self) -> bool {
self.id == other.id
}
}
impl Eq for TrackReference {}