Skip to main content

camel_language_api/
lib.rs

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