selene-core 0.3.1

selene-core is the backend for Selene, a local-first music player
Documentation
use sled::{Db, Tree};

use crate::{
    database::{DatabaseEntry, Patchable, patch_option_replace, patch_replace, track_tree},
    library::track::{Track, TrackId},
};

impl DatabaseEntry for Track {
    type Id = TrackId;
    const VERSION_NUMBER: u32 = 1;

    fn tree(db: &Db) -> Tree {
        track_tree(db)
    }

    fn id(&self) -> TrackId {
        self.id
    }
}

impl PartialEq for Track {
    fn eq(&self, other: &Self) -> bool {
        self.id == other.id
    }
}

impl Eq for Track {}

impl std::hash::Hash for Track {
    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
        state.write(self.id.as_bytes());
    }
}

impl Patchable<Self> for Track {
    fn patch(&mut self, patch: Self) {
        let Track {
            id: _,
            src_container,
            lib_container,
            relative_library_path,
            metadata,
            loudnorm_analysis,
            applied_loudnorm,
            version: _,
        } = patch;

        patch_replace(&mut self.src_container, Some(src_container));
        patch_option_replace(&mut self.lib_container, lib_container);
        patch_replace(&mut self.relative_library_path, Some(relative_library_path));
        self.metadata.patch(metadata);
        patch_option_replace(&mut self.loudnorm_analysis, loudnorm_analysis);
        patch_option_replace(&mut self.applied_loudnorm, applied_loudnorm);
    }
}