#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Volume {
Silent,
Regular,
Detailed,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Mode {
Charred,
Cooked,
#[default]
Rare,
Raw,
}
#[derive(Clone, Debug)]
struct OptionData {
volume: Volume,
mode: Mode,
timeout: u8,
pathological_size: usize,
read_buffer_size: usize,
write_buffer_size: usize,
}
impl OptionData {
pub const fn new() -> Self {
Self {
volume: Volume::Silent,
mode: Mode::Rare,
timeout: 10,
pathological_size: 512,
read_buffer_size: 256,
write_buffer_size: 1_024,
}
}
}
#[derive(Debug)]
pub struct OptionBuilder(OptionData);
impl OptionBuilder {
pub fn volume(&mut self, volume: Volume) -> &mut Self {
self.0.volume = volume;
self
}
pub fn mode(&mut self, mode: Mode) -> &mut Self {
self.0.mode = mode;
self
}
pub fn timeout(&mut self, timeout: u8) -> &mut Self {
self.0.timeout = timeout;
self
}
pub fn pathological_size(&mut self, size: usize) -> &mut Self {
self.0.pathological_size = size.max(
self.0
.read_buffer_size
.saturating_add(self.0.read_buffer_size),
);
self
}
pub fn read_buffer_size(&mut self, size: usize) -> &mut Self {
self.0.read_buffer_size = size;
self.0.pathological_size = self.0.pathological_size.max(size.saturating_add(size));
self
}
pub fn write_buffer_size(&mut self, size: usize) -> &mut Self {
self.0.write_buffer_size = size;
self
}
#[must_use = "the only reason to invoke method is to access the returned value"]
pub fn build(&self) -> Options {
Options(self.0.clone())
}
}
#[derive(Debug)]
pub struct Options(OptionData);
impl Default for Options {
fn default() -> Self {
Self(OptionData::new())
}
}
impl Options {
pub fn builder() -> OptionBuilder {
OptionBuilder(OptionData::new())
}
pub fn with_log() -> Self {
Self::builder().volume(Volume::Regular).build()
}
pub fn with_detailed_log() -> Self {
Self::builder().volume(Volume::Detailed).build()
}
pub fn volume(&self) -> Volume {
self.0.volume
}
pub fn mode(&self) -> Mode {
self.0.mode
}
pub fn timeout(&self) -> u8 {
self.0.timeout
}
pub fn pathological_size(&self) -> usize {
self.0.pathological_size
}
pub fn read_buffer_size(&self) -> usize {
self.0.read_buffer_size
}
pub fn write_buffer_size(&self) -> usize {
self.0.write_buffer_size
}
}