1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//! Storage backends for rate limiter state
//!
//! This module provides different storage strategies for managing rate limit data:
//!
//! - [`AdaptiveStore`]: Self-tuning cleanup intervals based on usage patterns
//! - [`PeriodicStore`]: Fixed interval cleanup for predictable workloads
//! - [`ProbabilisticStore`]: Random sampling cleanup for high-throughput scenarios
//!
//! All stores implement the [`Store`] trait, allowing them to be used interchangeably.
use ;
pub use ;
pub use ;
pub use ;
/// Storage backend for rate limiter state
///
/// The `Store` trait defines the interface for persisting rate limiter state.
/// Implementations manage the storage and retrieval of rate limit data with
/// support for atomic operations and TTL (time-to-live) expiration.
///
/// # Thread Safety
///
/// Store implementations are not required to be thread-safe. For concurrent
/// access, wrap the rate limiter in appropriate synchronization primitives.
///
/// # Example Implementation
///
/// ```ignore
/// use std::time::{Duration, SystemTime};
/// use throttlecrab::Store;
///
/// struct MyStore {
/// // Your storage implementation
/// }
///
/// impl Store for MyStore {
/// fn compare_and_swap_with_ttl(
/// &mut self,
/// key: &str,
/// old: i64,
/// new: i64,
/// ttl: Duration,
/// now: SystemTime,
/// ) -> Result<bool, String> {
/// // Implement atomic compare-and-swap
/// Ok(true)
/// }
///
/// fn get(&self, key: &str, now: SystemTime) -> Result<Option<i64>, String> {
/// // Retrieve value for key
/// Ok(None)
/// }
///
/// fn set_if_not_exists_with_ttl(
/// &mut self,
/// key: &str,
/// value: i64,
/// ttl: Duration,
/// now: SystemTime,
/// ) -> Result<bool, String> {
/// // Set value only if key doesn't exist
/// Ok(true)
/// }
/// }
/// ```