Skip to main content

switchback_protocols/
amqp.rs

1//! AMQP protocol implementation.
2
3use switchback_codec_pb::canardleteer::switchback::protocol::amqp::v1alpha1::{
4    AmqpChannelMeta, AmqpContractMeta, AmqpMessageMeta, AmqpOperationMeta, AmqpPayload,
5};
6use switchback_codec_pb::canardleteer::switchback::protocol::amqp::v1alpha1::__buffa::oneof::amqp_payload::Kind;
7use switchback_traits::ProtocolAttachment;
8
9use crate::traits::Protocol;
10use crate::wire::encode_message;
11
12/// Built-in AMQP protocol (`"amqp"`).
13#[derive(Clone, Copy, Debug, Default)]
14pub struct AmqpProtocol;
15
16impl Protocol for AmqpProtocol {
17    fn id(&self) -> &'static str {
18        "amqp"
19    }
20}
21
22impl AmqpProtocol {
23    /// Attach contract-level AMQP metadata.
24    pub fn attach_contract(&self, meta: &AmqpContractMeta) -> ProtocolAttachment {
25        attachment_from_payload(AmqpPayload {
26            kind: Some(Kind::Contract(Box::new(meta.clone()))),
27            ..Default::default()
28        })
29    }
30
31    /// Attach channel-level AMQP metadata.
32    pub fn attach_channel(&self, meta: &AmqpChannelMeta) -> ProtocolAttachment {
33        attachment_from_payload(AmqpPayload {
34            kind: Some(Kind::Channel(Box::new(meta.clone()))),
35            ..Default::default()
36        })
37    }
38
39    /// Attach operation-level AMQP metadata.
40    pub fn attach_operation(&self, meta: &AmqpOperationMeta) -> ProtocolAttachment {
41        attachment_from_payload(AmqpPayload {
42            kind: Some(Kind::Operation(Box::new(meta.clone()))),
43            ..Default::default()
44        })
45    }
46
47    /// Attach message-level AMQP metadata.
48    pub fn attach_message(&self, meta: &AmqpMessageMeta) -> ProtocolAttachment {
49        attachment_from_payload(AmqpPayload {
50            kind: Some(Kind::Message(Box::new(meta.clone()))),
51            ..Default::default()
52        })
53    }
54}
55
56fn attachment_from_payload(payload: AmqpPayload) -> ProtocolAttachment {
57    let protocol = AmqpProtocol;
58    ProtocolAttachment {
59        protocol_id: protocol.id().to_string(),
60        payload: encode_message(&payload),
61    }
62}