1use chrono::NaiveTime;
4
5mod counter;
7mod runtime;
8mod types;
9
10use counter::{DailyAddError, DailyCounter, RateWindow};
11pub use runtime::{LimitGuard, RuntimeCounters};
12pub use types::{
13 CheckCtx, LimitOutcome, LimitReason, Limits, ValueRejectReason, market_to_currency,
14 validate_order_value,
15};
16
17fn parse_window(s: &str) -> Result<(NaiveTime, NaiveTime), String> {
18 let (l, r) = s
19 .split_once('-')
20 .ok_or_else(|| format!("expect HH:MM-HH:MM, got {s:?}"))?;
21 let parse = |p: &str| {
22 NaiveTime::parse_from_str(p.trim(), "%H:%M").map_err(|e| format!("bad time {p:?}: {e}"))
23 };
24 Ok((parse(l)?, parse(r)?))
25}
26
27fn in_window(t: NaiveTime, start: NaiveTime, end: NaiveTime) -> bool {
29 if start <= end {
30 t >= start && t < end
31 } else {
32 t >= start || t < end
34 }
35}
36
37#[cfg(test)]
38mod tests;