10 个版本

0.3.2 2020年2月25日
0.3.1 2020年2月25日
0.2.5 2019年9月20日
0.1.1 2019年9月3日

#2 in #labeling

每月下载量 28

MIT 许可证

48KB
726 代码行(不含注释)

樱桃 - 表达式日志记录库

cherries at crates.io cherries at docs.rs CircleCI Actions Status Cherries 是一个用于将表达式以 JSON 结构进行日志记录的 crate。

用法

cherries 需要 rustc 1.37.0 或更高版本。将其添加到您的 Cargo.toml

[dependencies]
cherries = "0.3.1"

标签化

您可以使用构建器对叶子进行标签化,或者使用 labeled 方法进行重命名。

extern crate cherries;
use cherries::node::{Leaf, Cherries};

fn main() {
    // labeling
    let node = Leaf::new().value(1).name("node").build();
    assert_eq!(node.name(), &"node".to_string());
    
    // renaming
    let node = node.labeled("renamed");
    assert_eq!(node.name(), &"renamed".to_string());
}

验证

验证实用工具位于模块 cherries::validate 中。

  • 验证:为 Cherry<T> 提供扩展方法 validate 的 trait。
  • 验证链:允许链式调用 validate 并提供 into_result
  • 错误:验证错误的信息结构。
extern crate cherries;
use cherries::node::{Leaf, Cherry, Cherries};
use cherries::validate::{Validate, ValidateChain, Error};

fn main() {
    let node = Leaf::new().value(2).name("node").build();
    let validated = node
        .validate("must be even", |v| v % 2 == 0)
        .validate("must be less than 4", |v| v < 4)
        .into_result();

    assert_eq!(validated, Ok(Leaf::new().value(2).name("node").build()));

    let node = Leaf::new().value(1).name("node").build();
    let validated = node
        .validate("must be even", |v| v % 2 == 0)
        .validate("must be less than 4", |v| v < 4)
        .into_result();

    assert_eq!(
        Err(Error {
            label: "node".to_string(),
            msg: vec![
                 "must be even".to_string(),
                 "must be less than 4".to_string()
            ],
            tree: "some json".to_string()
        }),
        validated
    );
}

获取 JSON 字符串

您可以使用 Cherries::to_json() 获取具有 JSON 结构的表达式树。

extern crate cherries;
use cherries::node::{Leaf, Cherry, Cherries};
use cherries::validate::{Validate, ValidateChain, Error};

fn main() {
    let a = Leaf::new().value(2).name("a").build();
    let b = Leaf::new().value(3).name("b").build();
    let c = Leaf::new().value(4).name("c").build();
    let d = Leaf::new().value(1).name("d").build();
    
    let e = a + b;
    let f = c - d;
    let res = e * f;
    println!("{}", res.to_json());
}

输出

{
   "label":"(mul)",
   "value":15,
   "unit":"dimensionless",
   "subexpr":[
      {
         "label":"(add)",
         "value":5,
         "unit":"dimensionless",
         "subexpr":[
            {
               "label":"a",
               "value":2,
               "unit":"dimensionless"
            },
            {
               "label":"b",
               "value":3,
               "unit":"dimensionless"
            }
         ]
      },
      {
         "label":"(sub)",
         "value":3,
         "unit":"dimensionless",
         "subexpr":[
            {
               "label":"c",
               "value":4,
               "unit":"dimensionless"
            },
            {
               "label":"d",
               "value":1,
               "unit":"dimensionless"
            }
         ]
      }
   ]
}

映射

例如,向您展示如何使用 cherries 与 uom crate(单位度量)一起使用。让我们使用 map 方法应用 floor 方法。

extern crate cherries;
use cherries::node::{Leaf, Cherry, Cherries};
use cherries::validate::{Validate, ValidateChain, Error};
use uom::si::f32::*;
use uom::si::length::{meter};

fn main() {
    let x = Leaf::new()
        .name("x")
        .value(Length::new::<meter>(2.1))
        .build();
    let res = x.map(|x| x.floor::<meter>()).labeled("floor");
    assert_eq!(&Length::new::<meter>(2.0), res.quantity());
    assert_eq!(&"floor".to_string(), res.name());
    println!("{}", res.to_json());
}

输出

{
   "label":"floor",
   "value":2,
   "unit":"m^1",
   "subexpr":[
      {
         "label":"x",
         "value":2.1,
         "unit":"m^1"
      }
   ]
}

序列化/反序列化(v0.3.0~)

Cherry<T> where T: serde::Serialize + .../Cherry<T> where T: serde::Deserialize + ... 实现 serde::Serializeserde::Deserialize

许可证

在 MIT 许可证下授权。

依赖关系

~3.5–5.5MB
~97K SLoC