Skip to main content

camel_language_api/
lib.rs

1//! Language SPI for rust-camel — defines the core traits all expression/predicate languages implement.
2//!
3//! Main traits: `Language`, `Expression`, `Predicate`, `MutatingExpression`, `MutatingPredicate`.
4//! Main modules: `error`.
5
6pub mod error;
7
8pub use camel_api::Value;
9pub use camel_api::body::Body;
10pub use camel_api::exchange::Exchange;
11pub use camel_api::message::Message;
12pub use error::LanguageError;
13
14/// A Language factory: produces Expression and Predicate objects.
15pub trait Language: Send + Sync {
16    fn name(&self) -> &'static str;
17    fn create_expression(&self, script: &str) -> Result<Box<dyn Expression>, LanguageError>;
18    fn create_predicate(&self, script: &str) -> Result<Box<dyn Predicate>, LanguageError>;
19
20    /// Create a mutating expression. Default returns NotSupported.
21    fn create_mutating_expression(
22        &self,
23        _script: &str,
24    ) -> Result<Box<dyn MutatingExpression>, LanguageError> {
25        Err(LanguageError::NotSupported {
26            feature: "mutating expressions".into(),
27            language: self.name().into(),
28        })
29    }
30
31    /// Create a mutating predicate. Default returns NotSupported.
32    fn create_mutating_predicate(
33        &self,
34        _script: &str,
35    ) -> Result<Box<dyn MutatingPredicate>, LanguageError> {
36        Err(LanguageError::NotSupported {
37            feature: "mutating predicates".into(),
38            language: self.name().into(),
39        })
40    }
41}
42
43/// Evaluates to a Value against an Exchange.
44pub trait Expression: Send + Sync {
45    fn evaluate(&self, exchange: &Exchange) -> Result<Value, LanguageError>;
46}
47
48/// Expression that may modify the Exchange during evaluation.
49/// Changes to headers, properties, or body are propagated back.
50pub trait MutatingExpression: Send + Sync {
51    fn evaluate(&self, exchange: &mut Exchange) -> Result<Value, LanguageError>;
52}
53
54/// Evaluates to bool against an Exchange.
55pub trait Predicate: Send + Sync {
56    fn matches(&self, exchange: &Exchange) -> Result<bool, LanguageError>;
57}
58
59/// Predicate that may modify the Exchange during evaluation.
60/// Changes to headers, properties, or body are propagated back.
61///
62/// Reserved for future use. Not yet implemented by any language.
63pub trait MutatingPredicate: Send + Sync {
64    fn matches(&self, exchange: &mut Exchange) -> Result<bool, LanguageError>;
65}