20 个稳定版本

1.13.1 2023年7月6日
1.12.1 2023年3月29日
1.9.0 2022年10月19日
1.8.0 2022年6月21日
1.0.1 2021年7月31日

#216 in 算法

Download history 45/week @ 2024-04-22 40/week @ 2024-04-29 34/week @ 2024-05-06 24/week @ 2024-05-13 23/week @ 2024-05-20 35/week @ 2024-05-27 23/week @ 2024-06-03 31/week @ 2024-06-10 32/week @ 2024-06-17 48/week @ 2024-06-24 54/week @ 2024-07-01 50/week @ 2024-07-08 15/week @ 2024-07-15 44/week @ 2024-07-22 23/week @ 2024-07-29 15/week @ 2024-08-05

102 每月下载量

MIT 许可证

300KB
6.5K SLoC

tau 引擎

crates.io Documentation

此包提供了一组库,通过在文档上运行和匹配规则来标记文档。

概述

该引擎使用 Pratt 解析器和树求解器来评估规则对文档的检测逻辑,如果结果为真,则该文档被视为由该规则标记。

规则

规则用于标记文档,由三部分组成

  • detection:评估文档的逻辑。
  • true positives:必须评估为真的示例文档。
  • true negatives:必须评估为假的示例文档。

检测块由一个条件和标识符组成。这允许规则简单但表达性强,以下是一个简要总结:

标识符

标识符用于帮助保持条件简洁,通常包含匹配逻辑的核心。它们由键/值对组成,允许从文档中提取数据并评估其值。需要注意的是,映射被视为合取,而序列被视为析取。

标识符使用以下匹配逻辑:

  • foobar:foobar 的精确匹配
  • foobar*:以 foobar 开头
  • *foobar:以 foobar 结尾
  • *foobar*:包含 foobar
  • ?foobar:正则表达式 foobar

上述任何一种都可以使用 i 前缀进行不区分大小写的匹配,例如

  • ifoobar
  • ifoobar*

可以使用 '" 组合进行转义。

条件

条件只是一个布尔表达式,并支持以下操作:

  • and:逻辑合取
  • or:逻辑析取
  • ==:相等比较
  • >>=<<=:数值比较
  • not:取反
  • all(i):使序列表现为合取
  • of(i, x):确保序列至少有指定数量的匹配项

示例

这是一个示例,说明引擎如何根据提供的规则标记文档

tau-engine = "1.0"
use std::borrow::Cow;

use tau_engine::{Document, Rule, Value};

// Define a document.
struct Foo {
    foo: String,
}
impl Document for Foo {
    fn find(&self, key: &str) -> Option<Value<'_>> {
        match key {
            "foo" => Some(Value::String(Cow::Borrowed(&self.foo))),
            _ => None,
        }
    }
}

// Write a rule.
let rule = r#"
detection:
  A:
    foo: foobar
  condition: A
true_positives:
- foo: foobar
true_negatives:
- foo: foo
"#;

// Load and validate a rule.
let rule = Rule::load(rule).unwrap();
assert_eq!(rule.validate().unwrap(), true);

// Create a document.
let foo = Foo {
    foo: "foobar".to_owned(),
};

// Evalute the document with the rule.
assert_eq!(rule.matches(&foo), true);

这是一个示例,说明如何使用引擎在JSON上标记

tau-engine = { version = "1.0", features = ["json"] }
use serde_json::json;
use tau_engine::{Document, Rule};

// Write a rule.
let rule = r#"
detection:
  A:
    foo: foobar
  condition: A
true_positives:
- foo: foobar
true_negatives:
- foo: foo
"#;

// Load and validate a rule.
let rule = Rule::load(rule).unwrap();
assert_eq!(rule.validate().unwrap(), true);

// Create a document.
let foo = json!({
    "foo": "foobar",
});

// Evalute the document with the rule.
assert_eq!(rule.matches(&foo), true);

依赖

~5–7MB
~128K SLoC