use crate::{
transport::parameters::{InitialMaxStreamsBidi, InitialMaxStreamsUni, ValidationError},
varint::VarInt,
};
const DEFAULT_STREAM_MAX_SEND_BUFFER_SIZE: u32 = 4096 * 1024;
pub trait LocalLimits {
fn as_varint(&self) -> VarInt;
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct Limits {
pub max_send_buffer_size: MaxSendBufferSize,
pub max_open_local_unidirectional_streams: LocalUnidirectional,
pub max_open_local_bidirectional_streams: LocalBidirectional,
}
impl Default for Limits {
fn default() -> Self {
Self::RECOMMENDED
}
}
impl Limits {
pub const RECOMMENDED: Self = Self {
max_send_buffer_size: MaxSendBufferSize::RECOMMENDED,
max_open_local_unidirectional_streams: LocalUnidirectional::RECOMMENDED,
max_open_local_bidirectional_streams: LocalBidirectional::RECOMMENDED,
};
}
macro_rules! local_limits {
($name:ident($encodable_type:ty)) => {
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct $name($encodable_type);
};
}
macro_rules! varint_local_limits {
($name:ident($encodable_type:ty)) => {
local_limits!($name($encodable_type));
impl LocalLimits for $name {
#[inline]
fn as_varint(&self) -> VarInt {
self.0
}
}
impl TryFrom<u64> for $name {
type Error = ValidationError;
#[inline]
fn try_from(value: u64) -> Result<Self, Self::Error> {
let value = VarInt::new(value)?;
Ok(Self(value))
}
}
};
}
local_limits!(MaxSendBufferSize(u32));
impl MaxSendBufferSize {
pub const RECOMMENDED: Self = Self(DEFAULT_STREAM_MAX_SEND_BUFFER_SIZE);
#[inline]
pub fn as_u32(self) -> u32 {
self.0
}
}
impl TryFrom<u32> for MaxSendBufferSize {
type Error = ValidationError;
#[inline]
fn try_from(value: u32) -> Result<Self, Self::Error> {
Ok(Self(value))
}
}
varint_local_limits!(LocalUnidirectional(VarInt));
impl LocalUnidirectional {
pub const RECOMMENDED: Self = Self(InitialMaxStreamsUni::RECOMMENDED.as_varint());
}
varint_local_limits!(LocalBidirectional(VarInt));
impl LocalBidirectional {
pub const RECOMMENDED: Self = Self(InitialMaxStreamsBidi::RECOMMENDED.as_varint());
}
impl From<InitialMaxStreamsBidi> for LocalBidirectional {
fn from(value: InitialMaxStreamsBidi) -> Self {
Self(value.as_varint())
}
}