use super::database::Store;
use anyhow::{Context, Result};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchDocument {
pub id: Arc<str>,
pub content: Arc<str>,
pub doc_type: Arc<str>,
pub timestamp: u64,
}
pub struct SearchIndex {
store: Arc<Store>,
documents: Vec<SearchDocument>,
}
impl SearchIndex {
pub fn new(store: Arc<Store>) -> Self {
Self {
store,
documents: Vec::new(),
}
}
pub fn index(&mut self, doc: SearchDocument) {
self.documents.push(doc);
}
pub fn search(&self, query: &str, limit: usize) -> Vec<&SearchDocument> {
let query_lower = query.to_lowercase();
self.documents
.iter()
.filter(|doc| doc.content.to_lowercase().contains(&query_lower))
.take(limit)
.collect()
}
pub fn count(&self) -> usize {
self.documents.len()
}
pub fn clear(&mut self) {
self.documents.clear();
}
}
impl Default for SearchIndex {
fn default() -> Self {
Self::new(Arc::new(
Store::new(&dirs::home_dir().unwrap().join(".rsclaw").join("data")).unwrap(),
))
}
}