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