Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,4 @@ jobs:
# about some small leaks if backtraces are captured,
# so ensure they're not
RUST_BACKTRACE: 0
run: cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu
run: cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --lib --bins --tests
17 changes: 10 additions & 7 deletions engine/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,25 @@ an executable IR and, finally, executing filters against provided values.
## Example

```rust
use wirefilter::{ExecutionContext, Scheme, Type};
use wirefilter::{ExecutionContext, Scheme};

fn main() -> Result<(), Box<dyn std::error::Error>> {
// Create a map of possible filter fields.
let scheme = Scheme! {
http.method: Bytes,
http.ua: Bytes,
port: Int,
};
}
.build();

// Parse a Wireshark-like expression into an AST.
let ast = scheme.parse(r#"
http.method != "POST" &&
not http.ua matches "(googlebot|facebook)" &&
port in {80 443}
"#)?;
let ast = scheme.parse(
r#"
http.method != "POST" &&
not http.ua matches "(googlebot|facebook)" &&
port in {80 443}
"#,
)?;

println!("Parsed filter representation: {:?}", ast);

Expand Down
8 changes: 4 additions & 4 deletions engine/benches/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ static A: System = System;
use criterion::{Bencher, Criterion, criterion_group, criterion_main};
use std::{borrow::Cow, clone::Clone, fmt::Debug, net::IpAddr};
use wirefilter::{
ExecutionContext, FilterAst, FunctionArgKind, FunctionArgs, GetType, LhsValue, SchemeBuilder,
SimpleFunctionDefinition, SimpleFunctionImpl, SimpleFunctionParam, Type,
ExecutionContext, FilterAst, FunctionArgs, GetType, LhsValue, SchemeBuilder,
SimpleFunctionArgKind, SimpleFunctionDefinition, SimpleFunctionImpl, SimpleFunctionParam, Type,
};

fn lowercase<'a>(args: FunctionArgs<'_, 'a>) -> Option<LhsValue<'a>> {
Expand Down Expand Up @@ -209,7 +209,7 @@ fn bench_string_function_comparison(c: &mut Criterion) {
"lowercase",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand All @@ -221,7 +221,7 @@ fn bench_string_function_comparison(c: &mut Criterion) {
"uppercase",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand Down
8 changes: 4 additions & 4 deletions engine/examples/cli.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::env::args;
use wirefilter::{
FunctionArgKind, FunctionArgs, LhsValue, Scheme, SimpleFunctionDefinition, SimpleFunctionImpl,
SimpleFunctionOptParam, SimpleFunctionParam, Type,
FunctionArgs, LhsValue, Scheme, SimpleFunctionArgKind, SimpleFunctionDefinition,
SimpleFunctionImpl, SimpleFunctionOptParam, SimpleFunctionParam, Type,
};

fn panic_function<'a>(_: FunctionArgs<'_, 'a>) -> Option<LhsValue<'a>> {
Expand All @@ -28,11 +28,11 @@ fn main() {
"panic",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![SimpleFunctionOptParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
default_value: "".into(),
}],
return_type: Type::Bytes,
Expand Down
19 changes: 10 additions & 9 deletions engine/src/ast/field_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -799,7 +799,8 @@ impl Expr for ComparisonExpr {
mod tests {
use super::*;
use crate::{
BytesFormat, FieldRef, LhsValue, ParserSettings, SchemeBuilder, TypedMap,
BytesFormat, FieldRef, LhsValue, ParserSettings, SchemeBuilder, SimpleFunctionArgKind,
TypedMap,
ast::{
function_expr::{FunctionCallArgExpr, FunctionCallExpr},
logical_expr::LogicalExpr,
Expand Down Expand Up @@ -878,11 +879,11 @@ mod tests {
) -> Result<(), FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(FunctionArgKind::Field)?;
next_param.arg_kind().expect(FunctionArgKind::Field)?;
next_param.expect_val_type(once(ExpectedType::Array))?;
}
1 => {
next_param.expect_arg_kind(FunctionArgKind::Field)?;
next_param.arg_kind().expect(FunctionArgKind::Field)?;
next_param.expect_val_type(once(ExpectedType::Type(Type::Array(
Type::Bool.into(),
))))?;
Expand Down Expand Up @@ -979,7 +980,7 @@ mod tests {
"any",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Array(Type::Bool.into()),
}],
opt_params: vec![],
Expand All @@ -993,7 +994,7 @@ mod tests {
"echo",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand All @@ -1007,7 +1008,7 @@ mod tests {
"lowercase",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand All @@ -1023,11 +1024,11 @@ mod tests {
params: vec![],
opt_params: vec![
SimpleFunctionOptParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
default_value: "".into(),
},
SimpleFunctionOptParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
default_value: "".into(),
},
],
Expand All @@ -1044,7 +1045,7 @@ mod tests {
"len",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand Down
19 changes: 10 additions & 9 deletions engine/src/ast/function_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,7 @@ impl<'i> LexWith<'i, &FilterParser<'_>> for FunctionCallExpr {
mod tests {
use super::*;
use crate::{
SimpleFunctionArgKind,
ast::{
field_expr::{ComparisonExpr, ComparisonOpExpr, IdentifierExpr, OrderingOp},
logical_expr::{LogicalExpr, LogicalOp, ParenthesizedExpr},
Expand Down Expand Up @@ -602,7 +603,7 @@ mod tests {
"any",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Array(Type::Bool.into()),
}],
opt_params: vec![],
Expand All @@ -616,16 +617,16 @@ mod tests {
"echo",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![
SimpleFunctionOptParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
default_value: LhsValue::Int(10),
},
SimpleFunctionOptParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
default_value: LhsValue::Int(1),
},
],
Expand All @@ -639,7 +640,7 @@ mod tests {
"lower",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand All @@ -654,15 +655,15 @@ mod tests {
SimpleFunctionDefinition {
params: vec![
SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
},
SimpleFunctionParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
val_type: Type::Bytes,
},
SimpleFunctionParam {
arg_kind: FunctionArgKind::Literal,
arg_kind: SimpleFunctionArgKind::Literal,
val_type: Type::Bytes,
},
],
Expand All @@ -677,7 +678,7 @@ mod tests {
"len",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand Down
8 changes: 4 additions & 4 deletions engine/src/ast/index_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -529,8 +529,8 @@ impl<'a> Iterator for MapEachIterator<'a, '_> {
mod tests {
use super::*;
use crate::{
Array, FieldIndex, FilterParser, FunctionArgKind, FunctionArgs, FunctionCallArgExpr,
FunctionCallExpr, Scheme, SchemeBuilder, SimpleFunctionDefinition, SimpleFunctionImpl,
Array, FieldIndex, FilterParser, FunctionArgs, FunctionCallArgExpr, FunctionCallExpr,
Scheme, SchemeBuilder, SimpleFunctionArgKind, SimpleFunctionDefinition, SimpleFunctionImpl,
SimpleFunctionParam, ast::field_expr::IdentifierExpr,
};
use std::sync::LazyLock;
Expand Down Expand Up @@ -571,7 +571,7 @@ mod tests {
"array",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand All @@ -585,7 +585,7 @@ mod tests {
"array2",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand Down
4 changes: 2 additions & 2 deletions engine/src/ast/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ impl Visitor<'_> for UsesListVisitor<'_> {
#[cfg(test)]
mod tests {
use crate::{
AlwaysList, FunctionArgKind, Scheme, SimpleFunctionDefinition, SimpleFunctionImpl,
AlwaysList, Scheme, SimpleFunctionArgKind, SimpleFunctionDefinition, SimpleFunctionImpl,
SimpleFunctionParam, Type,
};
use std::sync::LazyLock;
Expand All @@ -239,7 +239,7 @@ mod tests {
"echo",
SimpleFunctionDefinition {
params: vec![SimpleFunctionParam {
arg_kind: FunctionArgKind::Field,
arg_kind: SimpleFunctionArgKind::Field,
val_type: Type::Bytes,
}],
opt_params: vec![],
Expand Down
2 changes: 1 addition & 1 deletion engine/src/functions/all.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl FunctionDefinition for AllFunction {
) -> Result<(), FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(FunctionArgKind::Field)?;
next_param.arg_kind().expect(FunctionArgKind::Field)?;
next_param.expect_val_type(once(Type::Array(Type::Bool.into()).into()))?;
}
_ => unreachable!(),
Expand Down
2 changes: 1 addition & 1 deletion engine/src/functions/any.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ impl FunctionDefinition for AnyFunction {
) -> Result<(), FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(FunctionArgKind::Field)?;
next_param.arg_kind().expect(FunctionArgKind::Field)?;
next_param.expect_val_type(once(Type::Array(Type::Bool.into()).into()))?;
}
_ => unreachable!(),
Expand Down
18 changes: 12 additions & 6 deletions engine/src/functions/cidr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,9 @@ fn cidr_impl<'a>(args: FunctionArgs<'_, 'a>) -> Option<LhsValue<'a>> {
(Ok(LhsValue::Ip(IpAddr::V6(ipv6_addr))), _, Ok(LhsValue::Int(prefix_length))) => Some(
LhsValue::Ip(IpAddr::V6(calc_ipv6_cidr_addr(ipv6_addr, prefix_length))),
),
(Err(Type::Ip), _, _) => return None,
(_, Err(Type::Int), _) => return None,
(_, _, Err(Type::Int)) => return None,
(Err(Type::Ip), _, _) => None,
(_, Err(Type::Int), _) => None,
(_, _, Err(Type::Int)) => None,
_ => unreachable!(),
}
}
Expand All @@ -157,15 +157,21 @@ impl FunctionDefinition for CIDRFunction {
) -> Result<(), super::FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(super::FunctionArgKind::Field)?;
next_param
.arg_kind()
.expect(super::FunctionArgKind::Field)?;
next_param.expect_val_type(iter::once(Type::Ip.into()))?;
}
1 => {
next_param.expect_arg_kind(super::FunctionArgKind::Literal)?;
next_param
.arg_kind()
.expect(super::FunctionArgKind::Literal)?;
next_param.expect_val_type(iter::once(Type::Int.into()))?;
}
2 => {
next_param.expect_arg_kind(super::FunctionArgKind::Literal)?;
next_param
.arg_kind()
.expect(super::FunctionArgKind::Literal)?;
next_param.expect_val_type(iter::once(Type::Int.into()))?;
}
_ => unreachable!(),
Expand Down
4 changes: 3 additions & 1 deletion engine/src/functions/decode_base64.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ impl FunctionDefinition for DecodeBase64Function {
) -> Result<(), super::FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(super::FunctionArgKind::Field)?;
next_param
.arg_kind()
.expect(super::FunctionArgKind::Field)?;
next_param.expect_val_type(std::iter::once(Type::Bytes.into()))?;
}
_ => unreachable!(),
Expand Down
4 changes: 2 additions & 2 deletions engine/src/functions/ends_with.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ impl FunctionDefinition for EndsWithFunction {
) -> Result<(), super::FunctionParamError> {
match params.len() {
0 => {
next_param.expect_arg_kind(FunctionArgKind::Field)?;
next_param.arg_kind().expect(FunctionArgKind::Field)?;
next_param.expect_val_type(iter::once(Type::Bytes.into()))?;
}
1 => {
next_param.expect_arg_kind(FunctionArgKind::Literal)?;
next_param.arg_kind().expect(FunctionArgKind::Literal)?;
next_param.expect_val_type(iter::once(Type::Bytes.into()))?;
}
_ => unreachable!(),
Expand Down
Loading