datadog_api_client/datadogV1/model/
model_service_level_objective_query.rs

1// Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License.
2// This product includes software developed at Datadog (https://www.datadoghq.com/).
3// Copyright 2019-Present Datadog, Inc.
4use serde::de::{Error, MapAccess, Visitor};
5use serde::{Deserialize, Deserializer, Serialize};
6use serde_with::skip_serializing_none;
7use std::fmt::{self, Formatter};
8
9/// A metric-based SLO. **Required if type is `metric`**. Note that Datadog only allows the sum by aggregator
10/// to be used because this will sum up all request counts instead of averaging them, or taking the max or
11/// min of all of those requests.
12#[non_exhaustive]
13#[skip_serializing_none]
14#[derive(Clone, Debug, PartialEq, Serialize)]
15pub struct ServiceLevelObjectiveQuery {
16    /// A Datadog metric query for total (valid) events.
17    #[serde(rename = "denominator")]
18    pub denominator: String,
19    /// A Datadog metric query for good events.
20    #[serde(rename = "numerator")]
21    pub numerator: String,
22    #[serde(flatten)]
23    pub additional_properties: std::collections::BTreeMap<String, serde_json::Value>,
24    #[serde(skip)]
25    #[serde(default)]
26    pub(crate) _unparsed: bool,
27}
28
29impl ServiceLevelObjectiveQuery {
30    pub fn new(denominator: String, numerator: String) -> ServiceLevelObjectiveQuery {
31        ServiceLevelObjectiveQuery {
32            denominator,
33            numerator,
34            additional_properties: std::collections::BTreeMap::new(),
35            _unparsed: false,
36        }
37    }
38
39    pub fn additional_properties(
40        mut self,
41        value: std::collections::BTreeMap<String, serde_json::Value>,
42    ) -> Self {
43        self.additional_properties = value;
44        self
45    }
46}
47
48impl<'de> Deserialize<'de> for ServiceLevelObjectiveQuery {
49    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
50    where
51        D: Deserializer<'de>,
52    {
53        struct ServiceLevelObjectiveQueryVisitor;
54        impl<'a> Visitor<'a> for ServiceLevelObjectiveQueryVisitor {
55            type Value = ServiceLevelObjectiveQuery;
56
57            fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
58                f.write_str("a mapping")
59            }
60
61            fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
62            where
63                M: MapAccess<'a>,
64            {
65                let mut denominator: Option<String> = None;
66                let mut numerator: Option<String> = None;
67                let mut additional_properties: std::collections::BTreeMap<
68                    String,
69                    serde_json::Value,
70                > = std::collections::BTreeMap::new();
71                let mut _unparsed = false;
72
73                while let Some((k, v)) = map.next_entry::<String, serde_json::Value>()? {
74                    match k.as_str() {
75                        "denominator" => {
76                            denominator =
77                                Some(serde_json::from_value(v).map_err(M::Error::custom)?);
78                        }
79                        "numerator" => {
80                            numerator = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
81                        }
82                        &_ => {
83                            if let Ok(value) = serde_json::from_value(v.clone()) {
84                                additional_properties.insert(k, value);
85                            }
86                        }
87                    }
88                }
89                let denominator =
90                    denominator.ok_or_else(|| M::Error::missing_field("denominator"))?;
91                let numerator = numerator.ok_or_else(|| M::Error::missing_field("numerator"))?;
92
93                let content = ServiceLevelObjectiveQuery {
94                    denominator,
95                    numerator,
96                    additional_properties,
97                    _unparsed,
98                };
99
100                Ok(content)
101            }
102        }
103
104        deserializer.deserialize_any(ServiceLevelObjectiveQueryVisitor)
105    }
106}