Skip to main content

omni_dev/datadog/
error.rs

1//! Error types for Datadog operations.
2
3use thiserror::Error;
4
5/// Errors that can occur during Datadog operations.
6#[derive(Error, Debug)]
7pub enum DatadogError {
8    /// Datadog credentials are not configured.
9    #[error("Datadog credentials not configured. Run `omni-dev datadog auth login`")]
10    CredentialsNotFound,
11
12    /// A Datadog API request failed.
13    #[error("Datadog API request failed: HTTP {status}: {body}")]
14    ApiRequestFailed {
15        /// HTTP status code.
16        status: u16,
17        /// Response body text, optionally suffixed with rate-limit details
18        /// when the status was 429.
19        body: String,
20    },
21
22    /// The configured Datadog site is invalid.
23    #[error("Invalid Datadog site: {0}")]
24    InvalidSite(String),
25
26    /// A time-range specification could not be parsed.
27    #[error("Invalid time range: {0}")]
28    InvalidTimeRange(String),
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn credentials_not_found_display() {
37        let err = DatadogError::CredentialsNotFound;
38        assert!(err.to_string().contains("not configured"));
39        assert!(err.to_string().contains("datadog auth login"));
40    }
41
42    #[test]
43    fn api_request_failed_display() {
44        let err = DatadogError::ApiRequestFailed {
45            status: 401,
46            body: "Unauthorized".to_string(),
47        };
48        let msg = err.to_string();
49        assert!(msg.contains("401"));
50        assert!(msg.contains("Unauthorized"));
51    }
52
53    #[test]
54    fn invalid_site_display() {
55        let err = DatadogError::InvalidSite("weird.example".to_string());
56        assert!(err.to_string().contains("weird.example"));
57    }
58
59    #[test]
60    fn invalid_time_range_display() {
61        let err = DatadogError::InvalidTimeRange("1h30m".to_string());
62        assert!(err.to_string().contains("1h30m"));
63    }
64}