use crate::{Concurrency, DirectLogger, Logger, QueuedLogger, service};
pub struct Vector {
capacity: usize,
max_retries: usize,
worker_count: usize,
}
impl Vector {
pub fn new(capacity: usize, max_retries: usize, worker_count: usize) -> Self {
Self {
capacity,
max_retries,
worker_count,
}
}
pub fn get_capacity(&self) -> usize {
self.capacity
}
pub fn get_max_retries(&self) -> usize {
self.max_retries
}
pub fn get_worker_count(&self) -> usize {
self.worker_count
}
pub fn capacity(self, capacity: usize) -> Self {
Self { capacity, ..self }
}
pub fn max_retries(self, max_retries: usize) -> Self {
Self {
max_retries,
..self
}
}
pub fn worker_count(self, worker_count: usize) -> Self {
Self {
worker_count,
..self
}
}
pub fn build(self, concurrency: Concurrency) -> Logger {
match concurrency {
Concurrency::Sync => Logger::new(self.build_impl_direct()),
Concurrency::Async => Logger::new(self.build_impl_queued()),
}
}
pub fn build_impl_direct(self) -> Box<DirectLogger> {
let max_retries = self.max_retries;
DirectLogger::new(self.build_service(), max_retries)
}
pub fn build_impl_queued(self) -> Box<QueuedLogger> {
let max_retries = self.max_retries;
let worker_count = self.worker_count;
QueuedLogger::new(self.build_service(), max_retries, worker_count)
}
pub fn build_service(self) -> Box<service::Vector> {
service::Vector::new(self.capacity)
}
}
impl Default for Vector {
fn default() -> Self {
Self {
capacity: 1024usize,
max_retries: 3,
worker_count: 1,
}
}
}