#interpreter #cel #group #duration

cel-interpreter

An interpreter for the Common Expression Language (CEL)

13 releases (8 breaking)

0.9.0 Nov 4, 2024
0.8.1 Jul 29, 2024
0.7.1 Jun 14, 2024
0.6.1 Mar 20, 2024
0.1.1 Dec 20, 2020

#32 in Programming languages

Download history 443/week @ 2024-12-04 380/week @ 2024-12-11 241/week @ 2024-12-18 32/week @ 2024-12-25 346/week @ 2025-01-01 539/week @ 2025-01-08 271/week @ 2025-01-15 551/week @ 2025-01-22 498/week @ 2025-01-29 481/week @ 2025-02-05 618/week @ 2025-02-12 727/week @ 2025-02-19 1109/week @ 2025-02-26 926/week @ 2025-03-05 890/week @ 2025-03-12 942/week @ 2025-03-19

4,042 downloads per month
Used in 5 crates

MIT license

195KB
4.5K SLoC

CEL Interpreter

Rust

The Common Expression Language (CEL) is a non-Turing complete language designed for simplicity, speed, safety, and portability. CEL's C-like syntax looks nearly identical to equivalent expressions in C++, Go, Java, and TypeScript. CEL is ideal for lightweight expression evaluation when a fully sandboxed scripting language is too resource intensive.

// Check whether a resource name starts with a group name.
resource.name.startsWith("/groups/" + auth.claims.group)
// Determine whether the request is in the permitted time window.
request.time - resource.age < duration("24h")
// Check whether all resource names in a list match a given filter.
auth.claims.email_verified && resources.all(r, r.startsWith(auth.claims.email))

Getting Started

This project includes a parser and an interpreter which means that it can be used to evaluate CEL-expressions. The library aims to be very simple to use, while still being fast, safe, and customizable.

use cel_interpreter::{Context, Program};

fn main() {
    // Compile a CEL program
    let program = Program::compile("add(2, 3)").unwrap();

    // Add any variables or functions that the program will need
    let mut context = Context::default();
    context.add_function("add", |a: i64, b: i64| a + b);

    // Run the program
    let value = program.execute(&context).unwrap();
    assert_eq!(value, 5.into());
}

Examples

Check out these other examples to learn how to use this library:

  • Simple - A simple example of how to use the library.
  • Variables - Passing variables and using them in your program.
  • Functions - Defining and using custom functions in your program.
  • Concurrent Execution - Executing the same program concurrently.

Dependencies

~4–7.5MB
~127K SLoC