diff --git a/rust/src/eval.rs b/rust/src/eval.rs new file mode 100644 index 00000000..ee71c4cb --- /dev/null +++ b/rust/src/eval.rs @@ -0,0 +1,28 @@ +use crate::parse::{Expression, Reference, Value}; + +impl<'a> Expression<'a> { + pub fn evaluate(&'a self, context: &serde_json::Value) -> Result { + match self { + Expression::Value(value) => value.evaluate(&context), + _ => Err("Unknown expression type".to_string()), + } + } +} + +impl<'a> Value<'a> { + pub fn evaluate(&'a self, context: &serde_json::Value) -> Result { + match self { + Value::Reference(reference) => reference.evaluate(&context), + _ => Err("Unknown value type".to_string()), + } + } +} + +impl<'a> Reference<'a> { + pub fn evaluate(&'a self, context: &'a serde_json::Value) -> Result { + match self { + Reference::At => Ok(context.clone()), + _ => Err("Unknown value type".to_string()), + } + } +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 736a13cb..1349e7d4 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,17 +1,19 @@ +pub mod eval; pub mod parse; pub fn query_value( query_str: String, - _data: serde_json::Value, -) -> Result { - let ast = parse::expr(&query_str); - dbg!(ast); - Err("unimplemented") + data: serde_json::Value, +) -> Result { + match parse::expr(&query_str) { + Ok((_, ast)) => ast.evaluate(&data), + Err(err) => Err(err.to_string()), + } } -pub fn query(query_str: String, data_str: String) -> Result { +pub fn query(query_str: String, data_str: String) -> Result { match serde_json::from_str(&data_str) { Ok(data) => query_value(query_str, data), - Err(_) => Err("Invalid JSON data"), + Err(_) => Err("Invalid JSON data".to_string()), } } diff --git a/rust/src/main.rs b/rust/src/main.rs index 71cfebe6..9bd94769 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -1,5 +1,5 @@ fn main() { - let query = "count @".to_string(); + let query = "@".to_string(); let data = r#" { "foo": "bar" } "#