6 个版本
| 0.1.8 | 2022 年 8 月 15 日 | 
|---|---|
| 0.1.7 | 2022 年 5 月 17 日 | 
| 0.1.6 | 2022 年 2 月 16 日 | 
900 在 算法 中
54KB
890 行
metrics_evaluation
metrics_evaluation 是一个简单的文本解析器,它评估给定的逻辑与 解析器(将名称解析为值)的结果,结果是一个单一的 bool 结果。在比较之前可以对值执行简单的算术运算。
它可以用于评估命名物联网指标与给定的逻辑,如果 evaluate 的结果为 true,则触发或不会触发操作。输入格式与 Rust 的 if 样式相同(不需要初始大括号)。目前算术运算仅限于 +(加)、-(减)、*(乘)和 /(除)。
可以评估变量与固定值之间的比较或变量与变量之间的比较。无论如何,目前比较总是限制在左边有一个变量名(WIP)。
使用方法
将此包添加到您的 cargo.toml
use metrics_evaluation::{parse_tree, solve_tree, Resolver};
实现一个可以提供给定变量名称查找的 解析器(如果该变量没有值,则返回 None)。为了方便使用和纯粹的懒惰,有一个 MapResolver,它是一个 Resolver,可以从 HashMap<K: AsRef<str>, V: Into<Value>> 形成(参见测试)。
将此 Resolver 传递给 evaluate 函数,并像在 rust 中检查给定值是否评估为 true|false 一样调用它。例如:foo + 2 == 42 && bar < 2 || (baz == true && baz + "30sec" >= "42min")。
以下运算符受支持,并且行为与 rust 相同
- >
- <
- >=
- <=
- ==
- !=
以下逻辑受支持,并且行为与 rust 相同
- and,- &&
- or,- ||
以下算术运算符受支持,但在不同 Value 类型中的实现不同
- +(加法)
- -(减法)
- *(乘法)
- /(除法)
以下 [Value] 可以进行比较
- Value::Numeric- 内部映射到 f64,并具有从- u8到- f64的- From实现。
- Value::String- 一个必须始终用引号括起来的字符串字面量。
- Value::Time- 映射到 NaiveTime,字符串表示必须匹配 "%H:%M:%S"。必须始终用引号括起来。
- Value::Duration- 一个表示持续时间的 humantime 字符串。必须始终用引号括起来。
比较的一般形式是 [Name] [Arithmetic] [Comparison-Operator] Value [Arithmetic] [[Logic]...]。
特性标志
- async- 对于需要异步功能的情况(例如异步数据库),除了 [Resolver] 和 [Solver] 之外,还有 [AsyncResolver] 和 [AsyncSolver]。在这种情况下使用- evaluate_async' in this case.`MapResolver` 在测试配置中仅可用(因为在生产中这样的特性没有意义)。
简单示例
使用 cargo run --example simple 或查看 solver 测试(文件末尾)或按以下方式使用它
use std::collections::HashMap;
use anyhow::Result;
use metrics_evaluation::{evaluate, MapResolver, Value};
fn main() -> Result<()> {
    let mut values = HashMap::new();
    values.insert("room1.temp", Value::Numeric(20.0));
    values.insert("room2.temp", Value::Numeric(22.0));
    values.insert("room1.humidity", Value::Numeric(80.0));
    values.insert(
        "worktime",
        Value::Duration(*"1h 5min 42s".parse::<humantime::Duration>().unwrap()),
    );
    let values: MapResolver = values.into();
    assert_eq!(
        evaluate(
            r#"(room1.temp > 1 || room1.humidity <= 80) && worktime > "1h 5min""#,
            &values
        )?,
        true
    );
    assert_eq!(evaluate(r#"worktime + "30m" > "1h""#, &values)?, true);
    assert_eq!(
        evaluate(r#"room2.temp > room1.temp && room2.temp < 25"#, &values)?,
        true
    );
    assert_eq!(evaluate(r#"room1.temp + 2 == room2.temp"#, &values)?, true);
    assert_eq!(
        evaluate(r#"room2.temp - 1  < room1.temp * 2"#, &values)?,
        true
    );
    Ok(())
}
许可证
metrics_evaluation 在MIT许可协议下分发。
有关详细信息,请参阅 LICENSE。
依赖项
~2.7–5MB
~89K SLoC