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