JMESPath Community is [the community implementation](https://jmespath.site/) of JMESPath, a query and transformation language for JSON.
# Evaluating JMESPath Expression
Use the [search](https://docs.rs/jmespath_community/0.1.0/jmespath_community/fn.search.html) function to evaluate a JMESPath expression.
## Example
```rust
use jmespath_community as jmespath;
use jmespath::{search, Value};
/ Parse some JSON data into a JMESPath variable
et json_str = "{\"foo\":{\"bar\":{\"baz\":true}}}";
et data = Value::from_json(json_str).unwrap();
```
A JMESPath expression can be parsed once and evaluated
multiple times using the [parse](https://docs.rs/jmespath_community/0.1.0/jmespath_community/fn.parse.html) function.
## Example
```rust
use jmespath_community as jmespath;
use jmespath::{parse, Value};
let ast = parse("foo").unwrap();
let data = Value::from_json(r#"{"foo": "bar"}"#).unwrap();
let result = ast.search(&data).unwrap();
assert_eq!("bar", result);
```
# Registering Custom Functions
JMESPath Community comes with a host of useful [builtin functions](https://jmespath.site/main/#functions).
However, it can be extended with [third-party functions](https://docs.rs/jmespath_community/0.1.0/jmespath_community/macro.function.html).
## Example
```rust
mod custom_functions {
use jmespath_community as jmespath;
use jmespath::function;
use jmespath::errors::Error as RuntimeError;
use jmespath::FunctionContext;
use jmespath::Value;
use jmespath::functions::ReturnValue;
use jmespath::functions::Function;
use jmespath::functions::DataType;
use jmespath::functions::ParamTypes::*;
use jmespath::functions::Parameter;
use jmespath::functions::Parameter::*;
function!(
add,
[
left => Required(Of(DataType::Number)),
right => Required(Of(DataType::Number))
],
arguments,
{
// type checking has been performed by the runtime
// safe to unwrap
let i = arguments[0].as_f64().unwrap();
let j = arguments[1].as_f64().unwrap();
Value::from_f64(i + j)
}
);
}
```
Create a new instance of the JMESPath [Runtime](https://docs.rs/jmespath_community/0.1.0/jmespath_community/struct.Runtime.html) object and
register your custom function:
## Example
```compile_fail
use jmespath_community as jmespath;
use jmespath::FunctionRegistrar;
use jmespath::{Runtime, Value};
let add = Box::new(custom_functions::add::new());
let mut runtime = Runtime::create_runtime();
runtime.register(add);
let expression = "foo";
let root = Value::Null;
let result = runtime.search(expression, &root).unwrap();
assert_eq!(None, result);
```