use std::collections::HashMap;
pub trait DeferredExpression: std::fmt::Debug + Send + Sync {
fn finalize(&self) -> String;
fn negate(&mut self);
fn is_negated(&self) -> bool;
}
#[derive(Debug, Clone)]
pub struct DeferredTextExpression {
pub template: String,
pub field: String,
pub value: String,
pub negated: bool,
pub operators: (&'static str, &'static str),
}
impl DeferredExpression for DeferredTextExpression {
fn finalize(&self) -> String {
let op = if self.negated {
self.operators.1
} else {
self.operators.0
};
self.template
.replace("{field}", &self.field)
.replace("{value}", &self.value)
.replace("{op}", op)
}
fn negate(&mut self) {
self.negated = !self.negated;
}
fn is_negated(&self) -> bool {
self.negated
}
}
#[derive(Debug)]
pub enum ConvertResult {
Query(String),
Deferred(Box<dyn DeferredExpression>),
}
#[derive(Debug, Default)]
pub struct ConversionState {
pub processing_state: HashMap<String, serde_json::Value>,
pub deferred: Vec<Box<dyn DeferredExpression>>,
}
impl ConversionState {
pub fn new(processing_state: HashMap<String, serde_json::Value>) -> Self {
Self {
processing_state,
deferred: Vec::new(),
}
}
pub fn add_deferred(&mut self, expr: Box<dyn DeferredExpression>) {
self.deferred.push(expr);
}
pub fn has_deferred(&self) -> bool {
!self.deferred.is_empty()
}
pub fn get_state_str(&self, key: &str) -> Option<&str> {
self.processing_state.get(key)?.as_str()
}
}