Skip to main content

probabilistic_rs/bloom/
config.rs

1use super::{BloomError, BloomResult};
2use derive_builder::Builder;
3use serde::{Deserialize, Serialize};
4use std::{path::PathBuf, time::Duration};
5
6#[derive(Clone, Debug, Builder, Serialize, Deserialize)]
7#[builder(pattern = "owned")]
8pub struct BloomFilterConfig {
9    #[builder(default = "1_000_000")]
10    pub capacity: usize,
11
12    #[builder(default = "0.01")]
13    pub false_positive_rate: f64,
14
15    #[builder(default = "None")]
16    pub persistence: Option<PersistenceConfig>,
17}
18
19#[derive(Builder, Clone, Debug, Serialize, Deserialize)]
20pub struct PersistenceConfig {
21    pub db_path: PathBuf,
22    #[builder(default = "Duration::from_secs(60)")]
23    pub snapshot_interval: Duration,
24    #[builder(default = "4096")] // 4KB per chunks
25    pub chunk_size_bytes: usize,
26    #[builder(default = "false")]
27    pub auto_snapshot: bool,
28}
29
30impl BloomFilterConfig {
31    pub fn validate(&self) -> super::BloomResult<()> {
32        if self.capacity == 0 {
33            return Err(super::BloomError::InvalidConfig(
34                "Capacity must be > 0".into(),
35            ));
36        }
37        if self.false_positive_rate <= 0.0 || self.false_positive_rate >= 1.0 {
38            return Err(super::BloomError::InvalidConfig(
39                "FPR must be between 0 and 1".into(),
40            ));
41        }
42        Ok(())
43    }
44
45    pub fn to_bytes(&self) -> BloomResult<Vec<u8>> {
46        postcard::to_allocvec(self)
47            .map_err(|e| BloomError::SerializationError(e.to_string()))
48    }
49
50    pub fn from_bytes(bytes: &[u8]) -> BloomResult<Self> {
51        postcard::from_bytes(bytes)
52            .map_err(|e| BloomError::SerializationError(e.to_string()))
53    }
54}