use std::str::FromStr;
use mineral_model::{AlbumId, AlbumRef, ArtistId, ArtistRef, MediaUrl, Song, SongId, SourceKind};
use sea_orm::FromQueryResult;
pub(crate) use crate::persistence::entity::song_meta::Model as SongMetaRow;
#[derive(FromQueryResult)]
pub(crate) struct SongArtistRow {
pub artist_id: String,
pub artist_name: String,
}
impl SongMetaRow {
pub(crate) fn into_song(self, artists: Vec<SongArtistRow>) -> crate::persistence::Result<Song> {
let source = SourceKind::from_name(&self.namespace);
let artists = artists
.into_iter()
.map(|a| ArtistRef {
id: ArtistId::new(source, a.artist_id),
name: a.artist_name,
})
.collect::<Vec<ArtistRef>>();
let album = match (self.album_id, self.album_name) {
(Some(aid), Some(aname)) => Some(AlbumRef {
id: AlbumId::new(source, aid),
name: aname,
}),
_ => None,
};
let cover_url = self.cover_url.map(|s| match MediaUrl::from_str(&s) {
Ok(u) => u,
Err(never) => match never {},
});
let duration_ms = self.duration_ms.map(u64::try_from).transpose()?;
Ok(Song::builder()
.id(SongId::new(source, self.song_value))
.name(self.name)
.alias(self.alias)
.artists(artists)
.album(album)
.duration_ms(duration_ms)
.cover_url(cover_url)
.build())
}
}