Skip to main content

lsm_tree/config/
compression.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2024-present, fjall-rs
3// Copyright (c) 2026-present, Dmitry Prudnikov
4
5use crate::CompressionType;
6#[cfg(not(feature = "std"))]
7use alloc::vec::Vec;
8
9/// Compression policy
10#[derive(Debug, Clone, Eq, PartialEq)]
11pub struct CompressionPolicy(Vec<CompressionType>);
12
13impl core::ops::Deref for CompressionPolicy {
14    type Target = [CompressionType];
15
16    fn deref(&self) -> &Self::Target {
17        &self.0
18    }
19}
20
21impl CompressionPolicy {
22    pub(crate) fn get(&self, level: usize) -> CompressionType {
23        #[expect(clippy::expect_used, reason = "policy is expected not to be empty")]
24        self.0
25            .get(level)
26            .copied()
27            .unwrap_or_else(|| self.last().copied().expect("policy should not be empty"))
28    }
29
30    /// Disables all compression.
31    #[must_use]
32    pub fn disabled() -> Self {
33        Self::all(CompressionType::None)
34    }
35
36    /// Uses the same compression in every level.
37    #[must_use]
38    pub fn all(c: CompressionType) -> Self {
39        Self(vec![c])
40    }
41
42    /// Constructs a custom compression policy.
43    ///
44    /// # Panics
45    ///
46    /// Panics if the policy is empty or contains more than 255 elements.
47    #[must_use]
48    pub fn new(policy: impl Into<Vec<CompressionType>>) -> Self {
49        let policy = policy.into();
50        assert!(!policy.is_empty(), "compression policy may not be empty");
51        assert!(policy.len() <= 255, "compression policy is too large");
52        Self(policy)
53    }
54}