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
48KB
726 代码行(不含注释)
樱桃 - 表达式日志记录库
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::Serialize
和 serde::Deserialize
。
许可证
在 MIT 许可证下授权。
依赖关系
~3.5–5.5MB
~97K SLoC