amq_protocol/frame/
structs.rs1use crate::{frame::parsing::traits::ParsableInput, protocol::*, types::*};
2use std::fmt;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq)]
6pub enum AMQPChannel {
7 Global,
9 Id(ChannelId),
11}
12
13impl AMQPChannel {
14 pub fn get_id(self) -> ChannelId {
16 match self {
17 AMQPChannel::Global => 0,
18 AMQPChannel::Id(id) => id,
19 }
20 }
21}
22
23impl From<ChannelId> for AMQPChannel {
24 fn from(id: ChannelId) -> AMQPChannel {
25 match id {
26 0 => AMQPChannel::Global,
27 id => AMQPChannel::Id(id),
28 }
29 }
30}
31
32#[derive(Clone, Copy, Debug, PartialEq, Eq)]
34pub enum AMQPFrameType {
35 ProtocolHeader,
37 Method,
39 Header,
41 Body,
43 Heartbeat,
45}
46
47#[derive(Clone, Debug, PartialEq)]
49pub enum AMQPFrame {
50 ProtocolHeader(ProtocolVersion),
52 Method(ChannelId, AMQPClass),
54 Header(ChannelId, AMQPContentHeader),
56 Body(ChannelId, Vec<u8>),
58 Heartbeat,
60 InvalidHeartbeat(ChannelId),
62}
63
64impl AMQPFrame {
65 pub fn is_header(&self) -> bool {
67 matches!(self, AMQPFrame::Header(..))
68 }
69
70 pub fn channel_id(&self) -> ChannelId {
72 match self {
73 AMQPFrame::ProtocolHeader(_) => 0,
74 AMQPFrame::Method(id, _) => *id,
75 AMQPFrame::Header(id, _) => *id,
76 AMQPFrame::Body(id, _) => *id,
77 AMQPFrame::Heartbeat => 0,
78 AMQPFrame::InvalidHeartbeat(id) => *id,
79 }
80 }
81}
82
83impl fmt::Display for AMQPFrame {
84 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
85 match self {
86 AMQPFrame::ProtocolHeader(version) => {
87 f.write_fmt(format_args!("AMQPFrame::ProtocolHeader({version})"))
88 }
89 AMQPFrame::Method(_, klass) => {
90 f.write_fmt(format_args!("AMQPFrame::Method({klass:?})"))
91 }
92 AMQPFrame::Header(..) => f.write_str("AMQPFrame::Header"),
93 AMQPFrame::Body(..) => f.write_str("AMQPFrame::Body"),
94 AMQPFrame::Heartbeat => f.write_str("AMQPFrame::Heartbeat"),
95 AMQPFrame::InvalidHeartbeat(id) => {
96 f.write_fmt(format_args!("AMQPFrame::InvalidHeartbeat({id})"))
97 }
98 }
99 }
100}
101
102#[derive(Clone, Copy, Debug, PartialEq, Eq)]
104pub struct ProtocolVersion {
105 pub major: ShortShortUInt,
107 pub minor: ShortShortUInt,
109 pub revision: ShortShortUInt,
111}
112
113impl ProtocolVersion {
114 pub fn amqp_0_9_1() -> Self {
116 Self {
117 major: metadata::MAJOR_VERSION,
118 minor: metadata::MINOR_VERSION,
119 revision: metadata::REVISION,
120 }
121 }
122}
123
124impl fmt::Display for ProtocolVersion {
125 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
126 f.write_fmt(format_args!(
127 "{}.{}.{}",
128 self.major, self.minor, self.revision
129 ))
130 }
131}
132
133#[derive(Clone, Copy, Debug, PartialEq, Eq)]
135pub struct AMQPRawFrame<I: ParsableInput> {
136 pub frame_type: AMQPFrameType,
138 pub channel_id: ChannelId,
140 pub payload: I,
142}
143
144#[derive(Clone, Debug, PartialEq)]
146pub struct AMQPContentHeader {
147 pub class_id: Identifier,
149 pub body_size: PayloadSize,
151 pub properties: basic::AMQPProperties,
153}