use std::fmt::{Display, Formatter, Result};
use crate::query::Comparison;
#[derive(Clone, Debug)]
enum Operator {
AND,
OR,
}
impl Display for Operator {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match self {
Self::AND => "&&",
Self::OR => "||",
}
)
}
}
#[derive(Clone, Debug)]
pub struct Filter {
comparisons: Vec<Comparison>,
operators: Vec<Operator>,
}
impl Filter {
pub fn new(comparison: Comparison) -> Self {
Self {
comparisons: vec![comparison],
operators: vec![],
}
}
pub fn and(mut self, comparison: Comparison) -> Self {
self.comparisons.push(comparison);
self.operators.push(Operator::AND);
self
}
pub fn or(mut self, comparison: Comparison) -> Self {
self.comparisons.push(comparison);
self.operators.push(Operator::OR);
self
}
pub fn to_aql(&self, collection_id: &str) -> String {
let mut res = String::new();
for (i, comparison) in self.comparisons.iter().enumerate() {
let operator_str = if i >= self.operators.len() {
String::new()
} else {
format!(" {}", self.operators[i].to_string())
};
res = format!(
"{} {}{}",
res,
comparison.to_aql(collection_id),
operator_str
)
}
String::from(res.trim_start())
}
}