Skip to main content

selene_core/library/track/
trait_impls.rs

1use 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}