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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//! Rate limit wrapper abstractions with Duration-based configuration.
//!
//! This module provides a unified RateLimit trait that wraps the core rate limiting
//! algorithms from rate-guard-core. The wrappers provide a consistent interface
//! while enabling Duration-based configuration and maintaining the diagnostic
//! capabilities of the underlying implementations.
//!
//! The RateLimit trait serves as a thin wrapper around rate-guard-core
//! implementations. It preserves both simple and verbose error reporting
//! capabilities while providing a consistent interface that integrates
//! time sources directly into the rate limiter.
//!
//! Available rate limiting algorithms:
//! - TokenBucket: Allows bursts up to capacity with sustained rate
//! - FixedWindowCounter: Fixed time windows with capacity limits
//! - SlidingWindowCounter: Sliding windows with multiple buckets
//! - ApproximateSlidingWindow: Memory-efficient approximation of sliding windows
use Uint;
use crate::;
// Re-export the main types for convenience
pub use ;
pub use ;
pub use ;
pub use ;
/// Trait for rate limiting operations with integrated time sources.
///
/// This trait provides a unified interface for all rate limiting algorithms,
/// where each implementation contains its own time source and precision configuration.
/// This eliminates the need for external time management and provides a clean,
/// self-contained API.
///
/// Unlike the previous design that required passing elapsed Duration to each method,
/// this trait integrates time source management directly into the rate limiter.
/// Each implementation handles time acquisition and precision conversion internally.
///
/// All methods are self-contained and thread-safe, making them suitable for
/// use in both single-threaded and multi-threaded environments.
///
/// # Examples
///
/// ```rust
/// use rate_guard::{TokenBucket, TokenBucketBuilder, Millis, MockTimeSource, RateLimit, RateLimitError};
/// use std::time::Duration;
///
/// // Create a rate limiter with builder pattern
/// let bucket = TokenBucketBuilder::builder()
/// .capacity(100)
/// .refill_amount(10)
/// .refill_every(Duration::from_millis(100))
/// .with_time(MockTimeSource::new())
/// .with_precision::<Millis>()
/// .build()
/// .unwrap();
///
/// // Use the rate limiter
/// assert!(bucket.try_acquire(50).is_ok());
/// assert_eq!(bucket.capacity_remaining().unwrap(), 50);
/// ```