#[derive(Debug, Default, Clone, Copy)]
pub struct Config {
pub endianness_strategy: EndiannessStrategy,
pub optional_strategy: OptionalStrategy,
pub container_length_strategy: ContainerLengthStrategy,
pub limit: Option<usize>,
}
impl Config {
pub fn new() -> Self {
Self::default()
}
pub fn with_big_endian(mut self) -> Self {
self.endianness_strategy = EndiannessStrategy::Big;
self
}
pub fn with_little_endian(mut self) -> Self {
self.endianness_strategy = EndiannessStrategy::Little;
self
}
pub fn with_untagged_optional(mut self) -> Self {
self.optional_strategy = OptionalStrategy::Untagged;
self
}
pub fn with_tagged_optional(mut self) -> Self {
self.optional_strategy = OptionalStrategy::Tagged;
self
}
pub fn with_container_size_as<T>(mut self) -> Self {
match std::mem::size_of::<T>() {
1 => self.container_length_strategy = ContainerLengthStrategy::OneByte,
2 => self.container_length_strategy = ContainerLengthStrategy::TwoBytes,
4 => self.container_length_strategy = ContainerLengthStrategy::FourBytes,
8 => self.container_length_strategy = ContainerLengthStrategy::EightBytes,
16 => self.container_length_strategy = ContainerLengthStrategy::SixteenBytes,
_ => panic!("Unsupported size for container size strategy"),
}
self
}
pub fn with_container_size_length(mut self, length: usize) -> Self {
match length {
1 => self.container_length_strategy = ContainerLengthStrategy::OneByte,
2 => self.container_length_strategy = ContainerLengthStrategy::TwoBytes,
4 => self.container_length_strategy = ContainerLengthStrategy::FourBytes,
8 => self.container_length_strategy = ContainerLengthStrategy::EightBytes,
16 => self.container_length_strategy = ContainerLengthStrategy::SixteenBytes,
_ => panic!("Unsupported size for container size strategy"),
}
self
}
pub fn with_limit(mut self, limit: usize) -> Self {
self.limit = Some(limit);
self
}
pub fn with_no_limit(mut self) -> Self {
self.limit = None;
self
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum EndiannessStrategy {
#[default]
Little,
Big,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum OptionalStrategy {
#[default]
Tagged,
Untagged,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum ContainerLengthStrategy {
OneByte,
TwoBytes,
#[default]
FourBytes,
EightBytes,
SixteenBytes,
}