#match #json #protobuf

nightly streamdal-wasm-detective

Data matcher library used by Streamdal WASM functions

13 releases

0.0.39 Jan 5, 2024
0.0.38 Jan 3, 2024
0.0.36 Dec 6, 2023
0.0.34 Nov 20, 2023
0.0.31 Oct 21, 2023

#140 in #match

MIT license

95KB
2.5K SLoC

wasm-detective

Release Test

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

For available matchers, look at the enums listed in streamdal/protos.

Install

cargo add streamdal-protos
cargo add streamdal-wasm-detective

Usage

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

You can also set nightly as default using rustup default nightly.

Releasing

Any changes made under libs/wasm-detective will be automatically released to crates.io with a version bump

Benchmarks

Valid as of 2023-11-14

test test_bench::bench_credit_card         ... bench:         730 ns/iter (+/- 8)
test test_bench::bench_credit_card_payload ... bench:       7,821 ns/iter (+/- 90)
test test_bench::bench_email               ... bench:         531 ns/iter (+/- 8)
test test_bench::bench_email_payload       ... bench:       6,150 ns/iter (+/- 78)
test test_bench::bench_email_utf8          ... bench:         907 ns/iter (+/- 9)
test test_bench::bench_has_field           ... bench:         386 ns/iter (+/- 11)
test test_bench::bench_hostname            ... bench:         410 ns/iter (+/- 6)
test test_bench::bench_ipv4_address        ... bench:         213 ns/iter (+/- 3)
test test_bench::bench_ipv6_address        ... bench:         320 ns/iter (+/- 2)
test test_bench::bench_mac_address         ... bench:         343 ns/iter (+/- 7)
test test_bench::bench_semver              ... bench:         378 ns/iter (+/- 6)
test test_bench::bench_string_contains_all ... bench:         218 ns/iter (+/- 4)
test test_bench::bench_string_contains_any ... bench:         221 ns/iter (+/- 1)
test test_bench::bench_uuid                ... bench:         402 ns/iter (+/- 6)

Dependencies

~16MB
~252K SLoC