use crate::{frame::parsing::traits::ParsableInput, protocol::*, types::*};
use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum AMQPChannel {
Global,
Id(ShortUInt),
}
impl AMQPChannel {
pub fn get_id(self) -> ShortUInt {
match self {
AMQPChannel::Global => 0,
AMQPChannel::Id(id) => id,
}
}
}
impl From<ShortUInt> for AMQPChannel {
fn from(id: ShortUInt) -> 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(ShortUInt, AMQPClass),
Header(ShortUInt, ShortUInt, Box<AMQPContentHeader>),
Body(ShortUInt, Vec<u8>),
Heartbeat(ShortUInt),
}
impl AMQPFrame {
pub fn is_header(&self) -> bool {
if let AMQPFrame::Header(..) = self {
true
} else {
false
}
}
}
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: u8,
pub minor: u8,
pub revision: u8,
}
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: ShortUInt,
pub payload: I,
}
#[derive(Clone, Debug, PartialEq)]
pub struct AMQPContentHeader {
pub class_id: ShortUInt,
pub weight: ShortUInt,
pub body_size: LongLongUInt,
pub properties: basic::AMQPProperties,
}