Skip to main content

ic_query/sns/report/model/requests/
metrics.rs

1//! Module: sns::report::model::requests::metrics
2//!
3//! Responsibility: bounded SNS Governance metrics request contract.
4//! Does not own: CLI parsing, discovery, live calls, or rendering.
5//! Boundary: validates the proposal-count window before any source access.
6
7use super::lookup::SnsLookupRequest;
8#[cfg(feature = "sns-host")]
9use crate::sns::report::SnsHostError;
10
11/// Default recent-proposal window used by SNS metrics reports.
12pub const DEFAULT_SNS_METRICS_TIME_WINDOW_SECONDS: u64 = 30 * 24 * 60 * 60;
13
14/// Largest recent-proposal window accepted by SNS metrics reports.
15pub const MAX_SNS_METRICS_TIME_WINDOW_SECONDS: u64 = 365 * 24 * 60 * 60;
16
17///
18/// SnsMetricsRequest
19///
20/// Request for one bounded SNS Governance metrics report.
21///
22
23#[derive(Clone, Debug, Eq, PartialEq)]
24pub struct SnsMetricsRequest {
25    /// SNS target, explicit endpoint, network and caller clock.
26    pub lookup: SnsLookupRequest,
27    /// Window used for recent submitted/executed proposal counts.
28    pub time_window_seconds: u64,
29}
30
31impl SnsMetricsRequest {
32    /// Construct a request with the default 30-day proposal-count window.
33    #[must_use]
34    pub const fn new(lookup: SnsLookupRequest) -> Self {
35        Self {
36            lookup,
37            time_window_seconds: DEFAULT_SNS_METRICS_TIME_WINDOW_SECONDS,
38        }
39    }
40
41    /// Replace the proposal-count window.
42    #[must_use]
43    pub const fn with_time_window_seconds(mut self, time_window_seconds: u64) -> Self {
44        self.time_window_seconds = time_window_seconds;
45        self
46    }
47}
48
49#[cfg(feature = "sns-host")]
50pub(in crate::sns::report) fn validate_sns_metrics_request(
51    request: &SnsMetricsRequest,
52) -> Result<(), SnsHostError> {
53    validate_sns_metrics_time_window(request.time_window_seconds)
54}
55
56#[cfg(feature = "sns-host")]
57pub(in crate::sns::report) fn validate_sns_metrics_time_window(
58    time_window_seconds: u64,
59) -> Result<(), SnsHostError> {
60    if !(1..=MAX_SNS_METRICS_TIME_WINDOW_SECONDS).contains(&time_window_seconds) {
61        return Err(SnsHostError::InvalidMetricsTimeWindow {
62            seconds: time_window_seconds,
63            max_seconds: MAX_SNS_METRICS_TIME_WINDOW_SECONDS,
64        });
65    }
66    Ok(())
67}