use anyhow::{Result, bail};
use crate::db::MasterDb;
use crate::library::load_rows;
use crate::query::Query;
pub struct Hit {
pub id: String,
pub title: String,
pub artist: String,
}
pub fn hits(db: &MasterDb, query: &str, max: usize) -> Result<Vec<Hit>> {
let parsed = Query::parse(query);
if parsed.is_empty() {
bail!("--match needs a query that actually filters something");
}
let rows = load_rows(db)?;
let matched: Vec<Hit> = rows
.iter()
.filter(|r| parsed.matches(r.fields()))
.map(|r| Hit {
id: r.id.clone(),
title: r.title.clone(),
artist: r.artist.clone(),
})
.collect();
if matched.is_empty() {
bail!("--match {query:?} matched no tracks");
}
if matched.len() > max {
bail!(
"--match {query:?} matched {} tracks, over the {max} cap. \
Narrow it, or raise --match-max.",
matched.len()
);
}
Ok(matched)
}