1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::fmt; use ntex_amqp_codec::protocol; use crate::cell::Cell; use crate::error::AmqpProtocolError; use crate::rcvlink::ReceiverLink; use crate::session::{Session, SessionInner}; use crate::sndlink::SenderLink; pub struct ControlFrame(pub(super) Cell<FrameInner>); pub(super) struct FrameInner { pub(super) kind: ControlFrameKind, pub(super) session: Option<Cell<SessionInner>>, } impl fmt::Debug for ControlFrame { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("ControlFrame") .field("kind", &self.0.get_ref().kind) .finish() } } #[derive(Debug)] pub enum ControlFrameKind { AttachReceiver(ReceiverLink), AttachSender(Box<protocol::Attach>, SenderLink), Flow(protocol::Flow, SenderLink), DetachSender(protocol::Detach, SenderLink), DetachReceiver(protocol::Detach, ReceiverLink), ProtocolError(AmqpProtocolError), Closed(bool), } impl ControlFrame { pub(crate) fn new(session: Cell<SessionInner>, kind: ControlFrameKind) -> Self { ControlFrame(Cell::new(FrameInner { session: Some(session), kind, })) } pub(crate) fn new_kind(kind: ControlFrameKind) -> Self { ControlFrame(Cell::new(FrameInner { session: None, kind, })) } pub(crate) fn clone(&self) -> Self { ControlFrame(self.0.clone()) } pub(crate) fn session_cell(&self) -> &Cell<SessionInner> { self.0.get_ref().session.as_ref().unwrap() } #[inline] pub fn frame(&self) -> &ControlFrameKind { &self.0.kind } pub fn session(&self) -> Option<Session> { self.0.get_ref().session.clone().map(Session::new) } }