Skip to main content

camel_language_api/
lib.rs

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