use super::Socket;
use crate::Record;
use alloc::collections::VecDeque;
use core::marker::PhantomData;
use core::num::NonZeroUsize;
#[derive(Debug)]
pub struct Builder<E, S = ()> {
capacity: usize,
limit: NonZeroUsize,
saved: bool,
socket: Socket<S>,
pd: PhantomData<E>,
}
impl<E, S> Builder<E, S> {
pub fn capacity(mut self, capacity: usize) -> Builder<E, S> {
self.capacity = capacity;
self
}
pub fn limit(mut self, limit: usize) -> Builder<E, S> {
self.limit = NonZeroUsize::new(limit).expect("limit can not be `0`");
self
}
pub fn saved(mut self, saved: bool) -> Builder<E, S> {
self.saved = saved;
self
}
pub fn connect(mut self, slot: S) -> Builder<E, S> {
self.socket = Socket::new(slot);
self
}
pub fn build(self) -> Record<E, S> {
Record {
limit: self.limit,
index: 0,
saved: self.saved.then_some(0),
socket: self.socket,
entries: VecDeque::with_capacity(self.capacity),
}
}
}
impl<E, S> Default for Builder<E, S> {
fn default() -> Self {
Builder {
capacity: 0,
limit: NonZeroUsize::new(usize::MAX).unwrap(),
saved: true,
socket: Socket::default(),
pd: PhantomData,
}
}
}