use std::{collections::HashMap, error::Error};
use serde::de::DeserializeOwned;
use crate::{
utils::find::find_many,
StartDB,
};
use super::filtering::{matches_filter, Filter};
type HandleResult<T> = Result<T, Box<dyn Error>>;
pub struct FindQuery<'a> {
db: &'a mut StartDB,
filter: Option<Filter>,
}
impl<'a> FindQuery<'a> {
pub fn new(db: &'a mut StartDB) -> Self {
Self {
db,
filter: None,
}
}
pub fn filter(mut self, filter: Filter) -> Self {
self.filter = Some(filter);
self
}
pub fn from<T: DeserializeOwned + serde::Serialize>(self, collection_name: &str) -> HandleResult<Vec<T>> {
let docs = find_many(&mut self.db.ss, collection_name);
let mut results = Vec::new();
for doc in docs {
match bson::from_slice::<bson::Document>(&doc.content) {
Ok(json_value) => {
if self.filter.as_ref().map_or(true, |f| matches_filter(&json_value, f)) {
match bson::from_document::<T>(json_value) {
Ok(value) => results.push(value),
Err(err) => eprintln!("Deserialization error: {}", err),
}
}
}
Err(err) => eprintln!("Failed to parse JSON for filtering: {}", err),
}
}
Ok(results)
}
}