use std::collections::{HashMap, VecDeque};
use bytes::Bytes;
use tokio::sync::mpsc;
use crate::config::CreditMode;
use crate::error::{LinkError, SendError};
use crate::link::credit::LinkCredit;
use crate::link::settlement::UnsettledMap;
use crate::proto::{LinkAttached, LinkEvent, Reply};
use crate::types::definitions::SenderSettleMode;
use crate::types::messaging::DeliveryState;
pub const MAX_UNSETTLED_PER_LINK: usize = 1 << 16;
#[derive(Debug)]
pub struct PendingSend {
pub body: Bytes,
pub settled: bool,
pub message_format: u32,
pub state: Option<DeliveryState>,
pub reply: Option<Reply<DeliveryState, SendError>>,
}
#[derive(Debug)]
pub struct SenderLink {
pub handle: u32,
pub remote_handle: Option<u32>,
pub name: String,
pub attached: bool,
pub events: mpsc::Sender<LinkEvent>,
pub pending_attach: Option<Reply<LinkAttached, LinkError>>,
pub credit: LinkCredit,
pub unsettled: UnsettledMap,
pub pending: HashMap<u32, (Reply<DeliveryState, SendError>, std::time::Instant)>,
pub outbox: VecDeque<PendingSend>,
pub settle_mode: SenderSettleMode,
next_tag: u64,
}
impl SenderLink {
pub fn new(
handle: u32,
name: String,
events: mpsc::Sender<LinkEvent>,
pending_attach: Reply<LinkAttached, LinkError>,
settle_mode: SenderSettleMode,
credit_mode: CreditMode,
) -> Self {
SenderLink {
handle,
remote_handle: None,
name,
attached: false,
events,
pending_attach: Some(pending_attach),
credit: LinkCredit::new(0, credit_mode),
unsettled: UnsettledMap::new(),
pending: HashMap::new(),
outbox: VecDeque::new(),
settle_mode,
next_tag: 0,
}
}
pub fn next_delivery_tag(&mut self) -> Bytes {
let tag = self.next_tag;
self.next_tag = self.next_tag.wrapping_add(1);
Bytes::copy_from_slice(&tag.to_be_bytes())
}
}