Skip to main content

futu_auth/limits/
mod.rs

1//! 限额:单笔、日累计、市场/品种白名单、时间窗口
2
3use chrono::NaiveTime;
4
5// Split from the former 1214-line limits.rs into focused submodules.
6mod 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
27/// 判断 `t` 是否在 [start,end) 窗口内;跨午夜时 start>end
28fn in_window(t: NaiveTime, start: NaiveTime, end: NaiveTime) -> bool {
29    if start <= end {
30        t >= start && t < end
31    } else {
32        // 跨午夜:22:00-04:00
33        t >= start || t < end
34    }
35}
36
37#[cfg(test)]
38mod tests;