Skip to main content

LayerFactory

Struct LayerFactory 

Source
pub struct LayerFactory(/* private fields */);
Expand description

Cloneable handle to a ProcessorLayer.

Debug is redacted to LayerFactory(...) so pipeline snapshots stay printable regardless of the wrapped layer’s Debug (same style as OpaqueProcessor).

Equality is Arc pointer identity, not structural: two factories built from equal-but-distinct layer values compare unequal. Builder tests rely on this to assert factory ORDER in nesting assertions while the layer itself stays private.

Implementations§

Source§

impl LayerFactory

Source

pub fn new(layer: impl ProcessorLayer + 'static) -> Self

Build a factory from any ProcessorLayer implementation.

§Example

A TimeoutLayer turns a slow producer into a timeout-classified error:

use std::time::Duration;

use camel_api::{BoxProcessor, CamelError, Exchange, LayerFactory, Message, ProcessorFn};
use tower::timeout::TimeoutLayer;

let producer: BoxProcessor = BoxProcessor::new(ProcessorFn::new(|_ex: Exchange| async {
    tokio::time::sleep(Duration::from_secs(5)).await;
    Ok(Exchange::new(Message::new("late")))
}));

let factory = LayerFactory::new(TimeoutLayer::new(Duration::from_millis(50)));
let wrapped = factory.wrap(producer).expect("timeout layer is Clone + Send");

// The 50ms timeout must fire well inside this 1s guard.
let result = tokio::time::timeout(
    Duration::from_secs(1),
    tower::ServiceExt::oneshot(wrapped, Exchange::new(Message::new("x"))),
)
.await
.expect("the timeout must fire before the 1s guard");
let err = result.expect_err("the 50ms timeout must fire before the 5s producer finishes");
assert!(
    err.to_string().contains("middleware timeout elapsed"),
    "expected a timeout-classified CamelError, got: {err}"
);

// Walk the public `source()` chain: the opaque payload returns the
// original error directly from `source()`, so the concrete `Elapsed` is
// the first chain node (reading the payload directly would bypass the
// consumer path).
let mut current = std::error::Error::source(&err);
let mut reached_elapsed = false;
for _ in 0..3 {
    let Some(node) = current else { break };
    if node.downcast_ref::<tower::timeout::error::Elapsed>().is_some() {
        reached_elapsed = true;
        break;
    }
    current = std::error::Error::source(node);
}
assert!(
    reached_elapsed,
    "source chain must reach tower Elapsed: {err:?}"
);
Source

pub fn wrap(&self, inner: BoxProcessor) -> Result<BoxProcessor, CamelError>

Wrap inner with the layer held by this factory.

Trait Implementations§

Source§

impl Clone for LayerFactory

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for LayerFactory

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for LayerFactory

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self> ⓘ

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more