use crate::jsonpath::ast::query::{AbsoluteQuery, Query, RelativeQuery};
use crate::jsonpath::eval::NodeList;
impl Query {
pub fn eval(
&self,
current_value: &serde_json::Value,
root_value: &serde_json::Value,
) -> NodeList {
match self {
Query::AbsoluteQuery(absolute_query) => absolute_query.eval(root_value),
Query::RelativeQuery(relative_query) => relative_query.eval(current_value, root_value),
}
}
}
impl RelativeQuery {
pub fn eval(
&self,
current_value: &serde_json::Value,
root_value: &serde_json::Value,
) -> NodeList {
let mut results = vec![current_value.clone()];
for segment in self.segments() {
results = results
.iter()
.flat_map(|current_value| segment.eval(current_value, root_value))
.collect();
}
results
}
}
impl AbsoluteQuery {
pub fn eval(&self, root_value: &serde_json::Value) -> NodeList {
let mut results = vec![root_value.clone()];
for segment in self.segments() {
results = results
.iter()
.flat_map(|current_value| segment.eval(current_value, root_value))
.collect();
}
results
}
}
#[cfg(test)]
mod tests {
use crate::jsonpath::ast::query::AbsoluteQuery;
#[allow(unused_imports)]
use serde_json::json;
#[test]
fn test_root_identifier() {
let root_value = json!({"greeting": "Hello"});
let root_identifier = AbsoluteQuery::new(vec![]);
assert_eq!(root_identifier.eval(&root_value), vec![root_value]);
}
}