use crate::consumer::Consumer; use crate::message::Message; use crate::{newtype, newtype_id, ChannelId}; use parking_lot::Mutex; use std::borrow::Borrow; use std::sync::atomic::AtomicUsize; use std::sync::Arc; pub type Queue = Arc; newtype_id!(pub QueueId); newtype!( /// The name of a queue. A newtype wrapper around `Arc`, which guarantees cheap clones. #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub QueueName: Arc ); impl Borrow for QueueName { fn borrow(&self) -> &str { std::borrow::Borrow::borrow(&self.0) } } #[derive(Debug)] pub struct RawQueue { pub id: QueueId, pub name: QueueName, pub messages: Mutex>, // use a concurrent linked list??? pub durable: bool, pub exclusive: Option, /// Whether the queue will automatically be deleted when no consumers uses it anymore. /// The queue can always be manually deleted. /// If auto-delete is enabled, it keeps track of the consumer count. pub deletion: QueueDeletion, pub consumers: Mutex>, } #[derive(Debug)] pub enum QueueDeletion { Auto(AtomicUsize), Manual, }