use super::*;
pub async fn search<I: UserInteraction>(
interaction: &I,
mut learner: Learner,
query: &str,
filter: &SearchFilter,
detailed: bool,
) -> Result<()> {
let mut papers = Query::text(query).execute(&mut learner.database).await?;
if let Some(author) = &filter.author {
let author_papers = Query::by_author(author).execute(&mut learner.database).await?;
papers.retain(|p| author_papers.contains(p));
}
if let Some(source) = &filter.source {
papers.retain(|p| p.source == *source);
}
if let Some(date_str) = &filter.before {
let date = parse_date(date_str)?;
papers.retain(|p| p.publication_date < date);
}
interaction.reply(ResponseContent::Info(&format!("Searching for: {}", query)))?;
if papers.is_empty() {
interaction.reply(ResponseContent::Info("No papers found matching all criteria"))
} else {
if detailed {
for paper in papers.iter() {
interaction.reply(ResponseContent::Paper(paper))?;
}
} else {
interaction.reply(ResponseContent::Papers(&papers))?;
}
Ok(())
}
}