7个版本 (3个稳定版本)

1.0.2 2024年7月31日
1.0.1 2024年7月21日
1.0.0 2024年4月22日
0.11.2 2024年4月17日
0.7.2 2024年1月11日

#200WebAssembly

Download history 5/week @ 2024-04-27 5/week @ 2024-06-29 26/week @ 2024-07-06 114/week @ 2024-07-20 165/week @ 2024-07-27 6/week @ 2024-08-03

每月下载量 285次

MIT 许可证

250KB
6.5K SLoC

RsCel是用Rust编写的CEL评估器。CEL是谷歌的一个项目,描述了一种图灵不完整语言,可以用来评估用户提供的表达式。语言规范可以在这里找到。

此项目的目标设计如下

  • 足够灵活,以便用户在需要时可以调整规范
  • 沙箱化,以便只能绑定特定值
  • 可以作为wasm依赖项(或其他ffi)使用

基本使用示例

use rscel::{CelContext, BindContext, serde_json};

let mut ctx = CelContext::new();
let mut exec_ctx = BindContext::new();

ctx.add_program_str("main", "foo + 3").unwrap();
exec_ctx.bind_param("foo", 3.into()); // 3 converted to CelValue

let res = ctx.exec("main", &exec_ctx).unwrap(); // CelValue::Int(6)
assert_eq!(res, 6.into());

从0.10.0版本开始,现在可以通过protobuf crate绑定protobuf消息!给定以下protobuf消息


message Point {
  int32 x = 1;
  int32 y = 2;
}

以下代码可以用来评估Point消息上的CEL表达式

use rscel::{CelContext, BindContext};

// currently rscel required protobuf messages to be in a box
let p = Box::new(protos::Point::new());
p.x = 4;
p.y = 5;

let mut ctx = CelContext::new();
let mut exec_ctx = BindContext::new();

ctx.add_program_str("main", "p.x + 3").unwrap();
exec_ctx.bind_protobuf_msg("p", p);

assert_eq!(ctx.exec("main", &exec_ctx).unwrap(), 7.into());

依赖项

~8–13MB
~207K SLoC