melors 0.2.2

Keyboard-first terminal MP3 player with queue, search, and tag editing
use fuzzy_matcher::FuzzyMatcher;
use fuzzy_matcher::skim::SkimMatcherV2;

use crate::core::model::Track;

pub fn search_tracks<'a>(
    matcher: &SkimMatcherV2,
    tracks: &'a [Track],
    keyword: &str,
) -> Vec<&'a Track> {
    if keyword.trim().is_empty() {
        return tracks.iter().collect();
    }

    let mut scored: Vec<(&Track, i64)> = tracks
        .iter()
        .filter_map(|track| {
            let title_score = matcher.fuzzy_match(&track.title, keyword);
            let artist_score = track
                .artist
                .as_deref()
                .and_then(|artist| matcher.fuzzy_match(artist, keyword));
            let album_score = track
                .album
                .as_deref()
                .and_then(|album| matcher.fuzzy_match(album, keyword));

            let score = title_score
                .into_iter()
                .chain(artist_score)
                .chain(album_score)
                .max();

            score.map(|value| (track, value))
        })
        .collect();

    scored.sort_by(|a, b| b.1.cmp(&a.1));
    scored.into_iter().map(|(track, _)| track).collect()
}