lilliput_core/
config.rs

1//! Configurations for encoding/decoding.
2
3pub use float::FloatEncoderConfig;
4pub use int::IntEncoderConfig;
5pub use length::LengthEncoderConfig;
6
7mod float;
8mod int;
9mod length;
10
11/// Mode used while packing values.
12#[cfg_attr(any(test, feature = "testing"), derive(proptest_derive::Arbitrary))]
13#[derive(Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
14#[repr(u8)]
15pub enum PackingMode {
16    /// No packing.
17    None = 0,
18    /// Packing down to native representations.
19    Native = 1,
20    /// Packing down to most optimal representations.
21    #[default]
22    Optimal = 2,
23}
24
25impl PackingMode {
26    pub(crate) fn is_optimal(self) -> bool {
27        self == Self::Optimal
28    }
29}
30
31/// Configuration used for encoding values.
32#[cfg_attr(any(test, feature = "testing"), derive(proptest_derive::Arbitrary))]
33#[derive(Default, Clone, PartialEq, Debug)]
34pub struct EncoderConfig {
35    /// Configuration used for encoding value lengths (in header extensions).
36    pub lengths: LengthEncoderConfig,
37    /// Configuration used for encoding integer values.
38    pub ints: IntEncoderConfig,
39    /// Configuration used for encoding floating-point values.
40    pub floats: FloatEncoderConfig,
41}
42
43impl EncoderConfig {
44    /// Sets packing-modes to `packing`, returning `self`.
45    pub fn with_packing(mut self, packing: PackingMode) -> Self {
46        self.lengths = self.lengths.with_packing(packing);
47        self.ints = self.ints.with_packing(packing);
48        self.floats = self.floats.with_packing(packing);
49        self
50    }
51}
52
53/// Configuration used for decoding values.
54#[cfg_attr(any(test, feature = "testing"), derive(proptest_derive::Arbitrary))]
55#[derive(Default, Copy, Clone, Eq, PartialEq, Hash, Debug)]
56pub struct DecoderConfig {}