Skip to main content

polyester/codecs/
analytics.rs

1//! Chain analytics helpers (Go `codecs/analytics.go` parity).
2
3use crate::errors::{Error, Result};
4use crate::proto::chain::analytics::v1::ChainAnalyticsRange;
5
6pub fn resolve_analytics_range(range_key: &str) -> Result<ChainAnalyticsRange> {
7    match range_key.trim().to_ascii_lowercase().as_str() {
8        "1d" => Ok(ChainAnalyticsRange::Day1),
9        "7d" => Ok(ChainAnalyticsRange::Day7),
10        "30d" => Ok(ChainAnalyticsRange::Day30),
11        "90d" => Ok(ChainAnalyticsRange::Day90),
12        "180d" => Ok(ChainAnalyticsRange::Day180),
13        "365d" => Ok(ChainAnalyticsRange::Day365),
14        _ => Err(Error::validation(
15            "range must be one of '1d', '7d', '30d', '90d', '180d', or '365d'",
16        )),
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn resolves_known_ranges() {
26        assert_eq!(
27            resolve_analytics_range("7d").unwrap(),
28            ChainAnalyticsRange::Day7
29        );
30        assert_eq!(
31            resolve_analytics_range("365D").unwrap(),
32            ChainAnalyticsRange::Day365
33        );
34    }
35
36    #[test]
37    fn rejects_unknown_range() {
38        assert!(resolve_analytics_range("2d").is_err());
39    }
40}