datadog_api_client/datadogV2/model/
model_metrics_scalar_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/// An individual scalar metrics query.
10#[non_exhaustive]
11#[skip_serializing_none]
12#[derive(Clone, Debug, PartialEq, Serialize)]
13pub struct MetricsScalarQuery {
14    /// The type of aggregation that can be performed on metrics-based queries.
15    #[serde(rename = "aggregator")]
16    pub aggregator: crate::datadogV2::model::MetricsAggregator,
17    /// A data source that is powered by the Metrics platform.
18    #[serde(rename = "data_source")]
19    pub data_source: crate::datadogV2::model::MetricsDataSource,
20    /// The variable name for use in formulas.
21    #[serde(rename = "name")]
22    pub name: Option<String>,
23    /// A classic metrics query string.
24    #[serde(rename = "query")]
25    pub query: String,
26    #[serde(flatten)]
27    pub additional_properties: std::collections::BTreeMap<String, serde_json::Value>,
28    #[serde(skip)]
29    #[serde(default)]
30    pub(crate) _unparsed: bool,
31}
32
33impl MetricsScalarQuery {
34    pub fn new(
35        aggregator: crate::datadogV2::model::MetricsAggregator,
36        data_source: crate::datadogV2::model::MetricsDataSource,
37        query: String,
38    ) -> MetricsScalarQuery {
39        MetricsScalarQuery {
40            aggregator,
41            data_source,
42            name: None,
43            query,
44            additional_properties: std::collections::BTreeMap::new(),
45            _unparsed: false,
46        }
47    }
48
49    pub fn name(mut self, value: String) -> Self {
50        self.name = Some(value);
51        self
52    }
53
54    pub fn additional_properties(
55        mut self,
56        value: std::collections::BTreeMap<String, serde_json::Value>,
57    ) -> Self {
58        self.additional_properties = value;
59        self
60    }
61}
62
63impl<'de> Deserialize<'de> for MetricsScalarQuery {
64    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
65    where
66        D: Deserializer<'de>,
67    {
68        struct MetricsScalarQueryVisitor;
69        impl<'a> Visitor<'a> for MetricsScalarQueryVisitor {
70            type Value = MetricsScalarQuery;
71
72            fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
73                f.write_str("a mapping")
74            }
75
76            fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
77            where
78                M: MapAccess<'a>,
79            {
80                let mut aggregator: Option<crate::datadogV2::model::MetricsAggregator> = None;
81                let mut data_source: Option<crate::datadogV2::model::MetricsDataSource> = None;
82                let mut name: Option<String> = None;
83                let mut query: Option<String> = None;
84                let mut additional_properties: std::collections::BTreeMap<
85                    String,
86                    serde_json::Value,
87                > = std::collections::BTreeMap::new();
88                let mut _unparsed = false;
89
90                while let Some((k, v)) = map.next_entry::<String, serde_json::Value>()? {
91                    match k.as_str() {
92                        "aggregator" => {
93                            aggregator = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
94                            if let Some(ref _aggregator) = aggregator {
95                                match _aggregator {
96                                    crate::datadogV2::model::MetricsAggregator::UnparsedObject(
97                                        _aggregator,
98                                    ) => {
99                                        _unparsed = true;
100                                    }
101                                    _ => {}
102                                }
103                            }
104                        }
105                        "data_source" => {
106                            data_source =
107                                Some(serde_json::from_value(v).map_err(M::Error::custom)?);
108                            if let Some(ref _data_source) = data_source {
109                                match _data_source {
110                                    crate::datadogV2::model::MetricsDataSource::UnparsedObject(
111                                        _data_source,
112                                    ) => {
113                                        _unparsed = true;
114                                    }
115                                    _ => {}
116                                }
117                            }
118                        }
119                        "name" => {
120                            if v.is_null() {
121                                continue;
122                            }
123                            name = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
124                        }
125                        "query" => {
126                            query = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
127                        }
128                        &_ => {
129                            if let Ok(value) = serde_json::from_value(v.clone()) {
130                                additional_properties.insert(k, value);
131                            }
132                        }
133                    }
134                }
135                let aggregator = aggregator.ok_or_else(|| M::Error::missing_field("aggregator"))?;
136                let data_source =
137                    data_source.ok_or_else(|| M::Error::missing_field("data_source"))?;
138                let query = query.ok_or_else(|| M::Error::missing_field("query"))?;
139
140                let content = MetricsScalarQuery {
141                    aggregator,
142                    data_source,
143                    name,
144                    query,
145                    additional_properties,
146                    _unparsed,
147                };
148
149                Ok(content)
150            }
151        }
152
153        deserializer.deserialize_any(MetricsScalarQueryVisitor)
154    }
155}