use crate::jsonpath::ast::singular_query::{
AbsoluteSingularQuery, RelativeSingularQuery, SingularQuery, SingularQuerySegment,
};
impl SingularQuery {
pub fn eval(
&self,
current_value: &serde_json::Value,
root_value: &serde_json::Value,
) -> Option<serde_json::Value> {
match self {
SingularQuery::Absolute(absolute_singular_query) => {
absolute_singular_query.eval(root_value)
}
SingularQuery::Relative(relative_singular_query) => {
relative_singular_query.eval(current_value)
}
}
}
}
impl AbsoluteSingularQuery {
pub fn eval(&self, value: &serde_json::Value) -> Option<serde_json::Value> {
let mut result = value.clone();
for segment in self.segments() {
if let Some(value) = segment.eval(&result) {
result = value;
} else {
return None;
}
}
Some(result.clone())
}
}
impl RelativeSingularQuery {
pub fn eval(&self, value: &serde_json::Value) -> Option<serde_json::Value> {
let mut result = value.clone();
for segment in self.segments() {
if let Some(value) = segment.eval(&result) {
result = value;
} else {
return None;
}
}
Some(result.clone())
}
}
impl SingularQuerySegment {
pub fn eval(&self, value: &serde_json::Value) -> Option<serde_json::Value> {
match self {
SingularQuerySegment::Name(name_selector) => name_selector.eval(value),
SingularQuerySegment::Index(index_selector) => index_selector.eval(value),
}
}
}
#[cfg(test)]
mod tests {}