use crate::ast::{DateBound, DateValue, FilterKind, QueryField, QueryNode, SizeOp};
#[allow(unused_variables)]
pub trait Visitor {
fn walk(&mut self, node: &QueryNode) {
match node {
QueryNode::Text(s) => self.visit_text(s),
QueryNode::Exact(s) => self.visit_exact(s),
QueryNode::Phrase(s) => self.visit_phrase(s),
QueryNode::Field { field, value } => self.visit_field(*field, value),
QueryNode::Filter(kind) => self.visit_filter(kind),
QueryNode::Label(name) => self.visit_label(name),
QueryNode::DateRange { bound, date } => self.visit_date(*bound, date),
QueryNode::Size { op, bytes } => self.visit_size(*op, *bytes),
QueryNode::Near {
left,
right,
distance,
} => self.visit_near(left, right, *distance),
QueryNode::And(l, r) => {
self.visit_and_pre(l, r);
self.walk(l);
self.walk(r);
self.visit_and_post(l, r);
}
QueryNode::Or(l, r) => {
self.visit_or_pre(l, r);
self.walk(l);
self.walk(r);
self.visit_or_post(l, r);
}
QueryNode::Not(inner) => {
self.visit_not_pre(inner);
self.walk(inner);
self.visit_not_post(inner);
}
}
}
fn visit_text(&mut self, s: &str) {}
fn visit_exact(&mut self, s: &str) {}
fn visit_phrase(&mut self, s: &str) {}
fn visit_field(&mut self, field: QueryField, value: &str) {}
fn visit_filter(&mut self, kind: &FilterKind) {}
fn visit_label(&mut self, name: &str) {}
fn visit_date(&mut self, bound: DateBound, date: &DateValue) {}
fn visit_size(&mut self, op: SizeOp, bytes: u64) {}
fn visit_near(&mut self, left: &str, right: &str, distance: u32) {}
fn visit_and_pre(&mut self, left: &QueryNode, right: &QueryNode) {}
fn visit_and_post(&mut self, left: &QueryNode, right: &QueryNode) {}
fn visit_or_pre(&mut self, left: &QueryNode, right: &QueryNode) {}
fn visit_or_post(&mut self, left: &QueryNode, right: &QueryNode) {}
fn visit_not_pre(&mut self, inner: &QueryNode) {}
fn visit_not_post(&mut self, inner: &QueryNode) {}
}