use ankit::{AnkiClient, NoteInfo, QueryBuilder};
use crate::Result;
#[derive(Debug)]
pub struct SearchEngine<'a> {
client: &'a AnkiClient,
}
impl<'a> SearchEngine<'a> {
pub(crate) fn new(client: &'a AnkiClient) -> Self {
Self { client }
}
pub async fn text(&self, text: &str, deck: Option<&str>) -> Result<Vec<NoteInfo>> {
let mut qb = QueryBuilder::new().contains(text);
if let Some(d) = deck {
qb = qb.deck(d);
}
self.execute_query(&qb.build()).await
}
pub async fn field(
&self,
field_name: &str,
text: &str,
deck: Option<&str>,
) -> Result<Vec<NoteInfo>> {
let mut qb = QueryBuilder::new().field(field_name, text);
if let Some(d) = deck {
qb = qb.deck(d);
}
self.execute_query(&qb.build()).await
}
pub async fn regex(
&self,
field_name: &str,
pattern: &str,
deck: Option<&str>,
) -> Result<Vec<NoteInfo>> {
let mut qb = QueryBuilder::new().field_regex(field_name, pattern);
if let Some(d) = deck {
qb = qb.deck(d);
}
self.execute_query(&qb.build()).await
}
pub async fn wildcard(
&self,
field_name: &str,
pattern: &str,
deck: Option<&str>,
) -> Result<Vec<NoteInfo>> {
let mut qb = QueryBuilder::new().field_wildcard(field_name, pattern);
if let Some(d) = deck {
qb = qb.deck(d);
}
self.execute_query(&qb.build()).await
}
pub async fn empty_field(&self, field_name: &str, deck: Option<&str>) -> Result<Vec<NoteInfo>> {
let mut qb = QueryBuilder::new().field_empty(field_name);
if let Some(d) = deck {
qb = qb.deck(d);
}
self.execute_query(&qb.build()).await
}
pub async fn query(&self, query: &str) -> Result<Vec<NoteInfo>> {
self.execute_query(query).await
}
async fn execute_query(&self, query: &str) -> Result<Vec<NoteInfo>> {
let note_ids = self.client.notes().find(query).await?;
if note_ids.is_empty() {
return Ok(Vec::new());
}
let notes = self.client.notes().info(¬e_ids).await?;
Ok(notes)
}
}