amq_protocol/frame/
structs.rsuse crate::{frame::parsing::traits::ParsableInput, protocol::*, types::*};
use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AMQPChannel {
Global,
Id(ChannelId),
}
impl AMQPChannel {
pub fn get_id(self) -> ChannelId {
match self {
AMQPChannel::Global => 0,
AMQPChannel::Id(id) => id,
}
}
}
impl From<ChannelId> for AMQPChannel {
fn from(id: ChannelId) -> AMQPChannel {
match id {
0 => AMQPChannel::Global,
id => AMQPChannel::Id(id),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AMQPFrameType {
ProtocolHeader,
Method,
Header,
Body,
Heartbeat,
}
#[derive(Clone, Debug, PartialEq)]
pub enum AMQPFrame {
ProtocolHeader(ProtocolVersion),
Method(ChannelId, AMQPClass),
Header(ChannelId, Identifier, Box<AMQPContentHeader>),
Body(ChannelId, Vec<u8>),
Heartbeat(ChannelId),
}
impl AMQPFrame {
pub fn is_header(&self) -> bool {
matches!(self, AMQPFrame::Header(..))
}
}
impl fmt::Display for AMQPFrame {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AMQPFrame::ProtocolHeader(version) => {
f.write_fmt(format_args!("AMQPFrame::ProtocolHeader({})", version))
}
AMQPFrame::Method(_, klass) => {
f.write_fmt(format_args!("AMQPFrame::Method({:?})", klass))
}
AMQPFrame::Header(..) => f.write_str("AMQPFrame::Header"),
AMQPFrame::Body(..) => f.write_str("AMQPFrame::Body"),
AMQPFrame::Heartbeat(_) => f.write_str("AMQPFrame::Heartbeat"),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ProtocolVersion {
pub major: ShortShortUInt,
pub minor: ShortShortUInt,
pub revision: ShortShortUInt,
}
impl ProtocolVersion {
pub fn amqp_0_9_1() -> Self {
Self {
major: metadata::MAJOR_VERSION,
minor: metadata::MINOR_VERSION,
revision: metadata::REVISION,
}
}
}
impl fmt::Display for ProtocolVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_fmt(format_args!(
"{}.{}.{}",
self.major, self.minor, self.revision
))
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct AMQPRawFrame<I: ParsableInput> {
pub frame_type: AMQPFrameType,
pub channel_id: ChannelId,
pub payload: I,
}
#[derive(Clone, Debug, PartialEq)]
pub struct AMQPContentHeader {
pub class_id: Identifier,
pub body_size: PayloadSize,
pub properties: basic::AMQPProperties,
}