use std::collections::VecDeque;
use bytes::Buf;
use crate::Encoder;
pub struct SendBudget<'a, TEncoder: Encoder> {
encoder: &'a mut TEncoder,
send_buffer: &'a mut VecDeque<TEncoder::Serialized>,
remaining: usize,
}
impl<'s, TEncoder: Encoder> SendBudget<'s, TEncoder> {
pub(crate) fn new(
encoder: &'s mut TEncoder,
send_buffer: &'s mut VecDeque<TEncoder::Serialized>,
remaining: usize,
) -> Self {
Self {
encoder,
send_buffer,
remaining,
}
}
pub fn reserve(&mut self) -> Option<SendPermit<'_, 's, TEncoder>> {
if self.remaining == 0 {
None
} else {
Some(SendPermit { budget: self })
}
}
}
pub struct SendPermit<'a, 'b, TEncoder: Encoder> {
budget: &'a mut SendBudget<'b, TEncoder>,
}
impl<TEncoder: Encoder> SendPermit<'_, '_, TEncoder> {
pub fn send(self, message: TEncoder::Message) {
self.budget.remaining -= 1;
let buffer = self.budget.encoder.encode(message);
log::trace!("serialized reactor message: {}b", buffer.remaining());
self.budget.send_buffer.push_back(buffer);
}
}