selene_core/library/track/
trait_impls.rs1use std::sync::Arc;
2
3use lunar_lib::database::{DatabaseEntry, TransactionError, caching::Cacheable};
4
5use crate::{
6 database::{LibraryDb, Resolveable, TRACK_CACHE},
7 library::track::{ResolvedTrack, Track, TrackId},
8};
9
10impl DatabaseEntry for Track {
11 type Id = TrackId;
12 type Db = LibraryDb;
13
14 const VERSION_NUMBER: u32 = 1;
15 const TREE_NAME: &str = "track";
16
17 fn id(&self) -> TrackId {
18 self.id
19 }
20}
21
22impl Resolveable for Track {
23 type Resolved = ResolvedTrack;
24
25 fn resolve(track: Arc<Self>, db: &Self::Db) -> Result<Self::Resolved, TransactionError> {
26 let artists = track.metadata().artists_cache(db)?;
27
28 let album = track.metadata().album_cache(db)?;
29 let album_artists = album.as_ref().map(|a| a.artists_cache(db)).transpose()?;
30
31 Ok(ResolvedTrack {
32 track,
33 album,
34 album_artists,
35 artists,
36 })
37 }
38}
39
40impl Cacheable for Track {
41 fn cache() -> &'static std::sync::Mutex<lunar_lib::database::caching::DbCache<Self>> {
42 &TRACK_CACHE
43 }
44}
45
46impl PartialEq for Track {
47 fn eq(&self, other: &Self) -> bool {
48 self.id == other.id
49 }
50}
51
52impl Eq for Track {}
53
54impl std::hash::Hash for Track {
55 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
56 state.write(&*self.id);
57 }
58}