#comparison #evaluation #metrics #parser #text-parser

metrics_evaluation

小型占位符解析器和求解器,用于(嵌套)基于文本的比较

6 个版本

0.1.8 2022 年 8 月 15 日
0.1.7 2022 年 5 月 17 日
0.1.6 2022 年 2 月 16 日

900算法

MIT 许可证

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,并具有从 u8f64From 实现。
  • 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