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
95KB
2.5K
SLoC
wasm-detective
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