streamdal-detective 0.0.28

Data matcher library used by Streamdal WASM functions
Documentation
wasm-detective
================
[![Release](https://github.com/streamdal/wasm-detective/actions/workflows/release.yaml/badge.svg)](https://github.com/streamdal/wasm-detective/actions/workflows/release.yaml)
[![Test](https://github.com/streamdal/wasm-detective/actions/workflows/pr.yaml/badge.svg)](https://github.com/streamdal/wasm-detective/actions/workflows/pr.yaml)

Rust helper lib for performing value matching in `streamdal/wasm` Wasm functions.

For available matchers, look at the enums listed in
[protos](https://github.com/streamdal/protos/blob/main/protos/steps/detective.proto).

# Install
```
cargo add streamdal-protos
cargo add streamdal-wasm-detective
```

# Usage
```rust
fn main() {
    let det = detective::Detective::new();

    let sample_json = r#"{
        "field1": {
            "field2": "2"
        }
    }"#;

    let request = Request {
        match_type: DetectiveType::DETECTIVE_TYPE_HAS_FIELD,
        data: &sample_json.as_bytes().to_vec(),
        path: "field1".to_string(),
        args: vec!["1".to_string()],
        negate: false,
    };

    match det.matches(&request) {
        Ok(value) => println!("Result: {:#?}", value),
        Err(err) => println!("Error: {:#?}", err),
    }
}
```

## Note on regex
Regex-based matchers are currently slow because we have to compile the pattern on every call.

This will improve when we implement K/V functionality in SDK's.

The idea is that WASM funcs will be given the ability to GET/PUT items in cache, so `detective` would be wired up to accept a param that is a trait that allows working with the cache funcs.

If K/V trait is provided to `detective` - before compiling a regex pattern, it would first check if the cache already contains it. If yes, it'll use that, if not, it'll compile and put it in the cache.

~DS 06-29-2023

## Development
The library must be tested using Rust nightly (because we use `#![feature(test)]` to enable the ability to bench).

To install nightly: `rustup install nightly`

To run tests using nightly: `cargo +nightly test`

To run benches using nightly: `cargo +nightly bench`

<sub>You can also set nightly as default using `rustup default nightly`.</sub>