cel-cxx 0.2.5

A high-performance, type-safe Rust interface for Common Expression Language (CEL), build on top of cel-cpp with zero-cost FFI bindings via cxx
Documentation
# 零注解函数注册


该库的核心特性使用**泛型关联类型(GATs)**自动推断函数签名,
无需手动类型注解:

```rust,no_run
use cel_cxx::*;

let env = Env::builder()
    // ✨ 函数签名自动从 Rust 类型推断!
    .register_global_function("add", |a: i64, b: i64| a + b)?
    .register_global_function("concat", |a: String, b: &str| a + b)?
    .register_global_function("length", |s: &str| s.len() as i64)?
    .register_global_function("parse", |s: &str| s.parse::<i64>())?  // Result<i64, _> 自动处理
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```

该系统支持多种函数模式:

## 拥有类型参数


函数可以接受拥有值,这些值会自动从 CEL 类型转换:

```rust,no_run
use cel_cxx::*;

let env = Env::builder()
    // 基本拥有类型
    .register_global_function("add", |a: i64, b: i64| a + b)?
    .register_global_function("concat", |a: String, b: String| a + &b)?
    .register_global_function("sum_list", |nums: Vec<i64>| nums.iter().sum::<i64>())?
    
    // 复杂拥有类型
    .register_global_function("process_map", |data: std::collections::HashMap<String, i64>| {
        data.values().sum::<i64>()
    })?
    .register_global_function("handle_optional", |maybe_val: Option<String>| {
        maybe_val.unwrap_or_else(|| "default".to_string())
    })?
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```

## 引用类型参数


引用参数支持零拷贝操作,适用于性能关键代码:

```rust,no_run
use cel_cxx::*;

let env = Env::builder()
    // 字符串引用 - 无需复制
    .register_global_function("length", |s: &str| s.len() as i64)?
    .register_global_function("starts_with", |text: &str, prefix: &str| text.starts_with(prefix))?
    
    // 集合元素引用 - 容器持有拥有值
    .register_global_function("first", |items: Vec<i64>| items.first().copied().unwrap_or(0))?
    .register_global_function("contains", |haystack: Vec<&str>, needle: &str| {
        haystack.iter().any(|&s| s == needle)
    })?
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```

## 引用类型返回值


函数可以返回其参数内数据的引用,实现高效的数据访问:

```rust,no_run
use cel_cxx::*;

// 定义返回引用的函数,使用适当的生命周期注解
fn get_domain(email: &str) -> &str {
    email.split('@').nth(1).unwrap_or("")
}

fn get_substring(text: &str, start: i64) -> &str {
    let start = start as usize;
    if start < text.len() { &text[start..] } else { "" }
}

let env = Env::builder()
    // 使用命名函数从借用参数返回字符串切片
    .register_global_function("get_domain", get_domain)?
    
    // 使用闭包从拥有容器返回拥有值
    .register_global_function("get_first", |items: Vec<String>| {
        items.into_iter().next().unwrap_or_default()
    })?
    
    // 使用命名函数返回参数数据的引用
    .register_global_function("get_substring", get_substring)?
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```

## 直接返回值 vs Result 类型


系统支持直接返回值和 `Result<T, E>` 用于错误处理:

```rust,no_run
use cel_cxx::*;
use std::num::ParseIntError;
use std::io;

let env = Env::builder()
    // 直接返回值 - 总是成功
    .register_global_function("double", |x: i64| x * 2)?
    .register_global_function("format_name", |first: &str, last: &str| {
        format!("{}, {}", last, first)
    })?
    
    // Result 返回值 - 可以使用标准库错误优雅地失败
    .register_global_function("parse_int", |s: &str| -> Result<i64, ParseIntError> {
        s.parse()
    })?
    .register_global_function("divide", |a: f64, b: f64| -> Result<f64, io::Error> {
        if b == 0.0 {
            Err(io::Error::new(io::ErrorKind::InvalidInput, "Division by zero"))
        } else {
            Ok(a / b)
        }
    })?
    
    // 具有拥有返回值和具体错误类型的 Result
    .register_global_function("safe_index", |items: Vec<String>, idx: i64| -> Result<String, io::Error> {
        let index = idx as usize;
        items.get(index)
            .cloned()
            .ok_or_else(|| io::Error::new(io::ErrorKind::InvalidInput, "Index out of bounds"))
    })?
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```

## 同步 vs 异步函数


同步和异步函数都得到无缝支持:

```rust,no_run
# #[cfg(feature = "async")]

# async fn example() -> Result<(), cel_cxx::Error> {

use cel_cxx::*;

let env = Env::builder()
    .use_tokio()
    
    // 同步函数 - 立即执行
    .register_global_function("sync_add", |a: i64, b: i64| a + b)?
    .register_global_function("sync_format", |name: &str| format!("Hello, {}", name))?
    
    // 异步函数 - 返回 future
    .register_global_function("async_fetch", async |id: i64| -> Result<String, std::io::Error> {
        // 模拟异步数据库调用
        tokio::time::sleep(std::time::Duration::from_millis(100)).await;
        Ok(format!("Data for ID: {}", id))
    })?
    .register_global_function("async_validate", async |email: &str| -> Result<bool, std::fmt::Error> {
        // 模拟异步验证服务
        tokio::time::sleep(std::time::Duration::from_millis(50)).await;
        Ok(email.contains('@'))
    })?
    
    // 在同一环境中混合同步和异步
    .register_global_function("process", |data: String| data.to_uppercase())?
    .register_global_function("async_process", async |data: String| {
        tokio::time::sleep(std::time::Duration::from_millis(10)).await;
        data.to_lowercase()
    })?
    .build()?;

// 当使用任何异步函数时进行异步求值
let program = env.compile("async_fetch(42) + ' - ' + async_validate('user@example.com')")?;
let result = program.evaluate(()).await?;
# Ok(())

# }

```

## 函数签名示例


以下是支持的函数签名的全面概述:

```rust,no_run
use cel_cxx::*;

// 定义返回引用的函数,使用适当的生命周期注解
fn substring_fn(s: &str, start: i64, len: i64) -> &str {
    let start = start as usize;
    let end = (start + len as usize).min(s.len());
    &s[start..end]
}

// 所有这些函数签名都是自动推断的:
let env = Env::builder()
    // 无参数
    .register_global_function("now", || std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs() as i64)?
    .register_global_function("pi", || std::f64::consts::PI)?
    
    // 单参数 - 各种类型
    .register_global_function("abs", |x: i64| x.abs())?
    .register_global_function("uppercase", |s: String| s.to_uppercase())?
    .register_global_function("len", |s: &str| s.len() as i64)?
    
    // 多参数 - 混合类型(使用命名函数处理生命周期)
    .register_global_function("substring", substring_fn)?
    
    // 泛型集合 - 拥有容器
    .register_global_function("join", |items: Vec<String>, sep: &str| items.join(sep))?
    .register_global_function("filter_positive", |nums: Vec<i64>| {
        nums.into_iter().filter(|&x| x > 0).collect::<Vec<_>>()
    })?
    
    // 可选类型
    .register_global_function("unwrap_or", |opt: Option<String>, default: String| {
        opt.unwrap_or(default)
    })?
    
    // 用于错误处理的 Result 类型,使用标准库错误
    .register_global_function("safe_divide", |a: f64, b: f64| -> Result<f64, std::io::Error> {
        if b == 0.0 { 
            Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, "Division by zero")) 
        } else { 
            Ok(a / b) 
        }
    })?
    .register_global_function("parse_float", |s: &str| -> Result<f64, std::num::ParseFloatError> {
        s.parse()
    })?
    .build()?;
# Ok::<(), cel_cxx::Error>(())

```