Skip to main content

camel_api/
data_format.rs

1use crate::Exchange;
2use crate::body::Body;
3use crate::error::CamelError;
4
5pub trait DataFormat: Send + Sync + 'static {
6    fn name(&self) -> &str;
7
8    fn marshal(&self, body: Body) -> Result<Body, CamelError>;
9
10    fn unmarshal(&self, body: Body) -> Result<Body, CamelError>;
11
12    /// Exchange-aware marshal hook. Default delegates to `marshal`.
13    /// Override when the format needs Exchange context (e.g., writing
14    /// metadata headers like `CamelCsvHeaderRecord`).
15    fn marshal_in_exchange(&self, exchange: &mut Exchange, body: Body) -> Result<Body, CamelError> {
16        let _ = exchange;
17        self.marshal(body)
18    }
19
20    /// Exchange-aware unmarshal hook. Default delegates to `unmarshal`.
21    /// Override when the format needs Exchange context (e.g., capturing
22    /// metadata headers like `CamelCsvHeaderRecord`).
23    fn unmarshal_in_exchange(
24        &self,
25        exchange: &mut Exchange,
26        body: Body,
27    ) -> Result<Body, CamelError> {
28        let _ = exchange;
29        self.unmarshal(body)
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36    use crate::exchange::Exchange;
37
38    struct DummyFormat;
39
40    impl DataFormat for DummyFormat {
41        fn name(&self) -> &str {
42            "dummy"
43        }
44        fn marshal(&self, _body: Body) -> Result<Body, CamelError> {
45            Ok(Body::Text("marshaled".into()))
46        }
47        fn unmarshal(&self, _body: Body) -> Result<Body, CamelError> {
48            Ok(Body::Text("unmarshaled".into()))
49        }
50    }
51
52    #[test]
53    fn test_default_marshal_in_exchange_delegates() {
54        let mut ex = Exchange::default();
55        let df = DummyFormat;
56        let result = df.marshal_in_exchange(&mut ex, Body::Empty);
57        assert_eq!(result.unwrap(), Body::Text("marshaled".into()));
58    }
59
60    #[test]
61    fn test_default_unmarshal_in_exchange_delegates() {
62        let mut ex = Exchange::default();
63        let df = DummyFormat;
64        let result = df.unmarshal_in_exchange(&mut ex, Body::Empty);
65        assert_eq!(result.unwrap(), Body::Text("unmarshaled".into()));
66    }
67}