Goal
Upgrade our cel dependency from 0.12.0 to 0.14.0 in two steps, with 0.13 as a stable midpoint.
Why two steps
- 0.13.0 (2026-03-12) introduced the "dyn Val" rewrite —
Value becomes an outer convenience layer over Box<dyn Val>, Context stores dyn Val directly (no longer Send), and trait-driven dispatch (Adder, Comparer, Indexer, Sizer, etc.) replaces the previous ad-hoc impls. Also: no type coercion on map index access; NoSuchOverload when indexing into strings; Err-resilient AND/OR.
- 0.14.0 (release PR clarkmcc/cel-rust#279, open since 2026-03-12) adds struct support (
StructDef, CelStruct), Optional proper overloads, removes lifetimes from Type/Env, and removes contains from containers (string-only).
Going through 0.13 first lets us absorb the dyn-Val refactor against a released, semver-stable target before chasing the moving 0.14 surface.
Our cel surface area (everything that will need to change)
src/lib.rs / src/context.rs — exhaustive Value::* pattern matching for Python conversions (Null, Bool, Int, UInt, Float, Timestamp, Duration, String, List, Bytes, Map, Opaque).
cel::Context construction and variable insertion.
cel::Program::compile and execution.
cel::ExecutionError — we match exhaustively to map to typed Python exceptions (UndeclaredReference, UnsupportedBinaryOperator, FunctionError, …).
cel::objects::{Key, OptionalValue, TryIntoValue}.
cel::extractors::Arguments for user-registered functions.
Value::Opaque(Arc<…>) for our Optional wrapper.
Plan
Phase 1 — Upgrade to 0.13.0
Phase 2 — Upgrade to 0.14.0 (wait for release)
Phase 3 — Repo move
Related upstream activity worth watching
Goal
Upgrade our
celdependency from 0.12.0 to 0.14.0 in two steps, with 0.13 as a stable midpoint.Why two steps
Valuebecomes an outer convenience layer overBox<dyn Val>,Contextstoresdyn Valdirectly (no longerSend), and trait-driven dispatch (Adder,Comparer,Indexer,Sizer, etc.) replaces the previous ad-hoc impls. Also: no type coercion on map index access;NoSuchOverloadwhen indexing into strings;Err-resilient AND/OR.StructDef,CelStruct),Optionalproper overloads, removes lifetimes fromType/Env, and removescontainsfrom containers (string-only).Going through 0.13 first lets us absorb the dyn-Val refactor against a released, semver-stable target before chasing the moving 0.14 surface.
Our cel surface area (everything that will need to change)
src/lib.rs/src/context.rs— exhaustiveValue::*pattern matching for Python conversions (Null, Bool, Int, UInt, Float, Timestamp, Duration, String, List, Bytes, Map, Opaque).cel::Contextconstruction and variable insertion.cel::Program::compileand execution.cel::ExecutionError— we match exhaustively to map to typed Python exceptions (UndeclaredReference,UnsupportedBinaryOperator,FunctionError, …).cel::objects::{Key, OptionalValue, TryIntoValue}.cel::extractors::Argumentsfor user-registered functions.Value::Opaque(Arc<…>)for ourOptionalwrapper.Plan
Phase 1 — Upgrade to 0.13.0
cel = "0.13"inCargo.toml.Value/Contextinterop to the dyn-Val model (Context storesdyn Val; we loseSend).ExecutionErrormapping for any renamed/removed variants.bench.py) and note any regression.Phase 2 — Upgrade to 0.14.0 (wait for release)
Type/Envusage.containsno longer works on containers (string-only).Phase 3 — Repo move
clarkmcc/cel-rustto thecel-rustorg (#237). Update any links/docs once the move completes.Related upstream activity worth watching
NoSuchOverload. Relevant to Distinguish parse errors from execution errors with different exception types #23 (typed exception split).