datadog_api_client/datadogV2/model/
model_metrics_scalar_query.rs1use serde::de::{Error, MapAccess, Visitor};
5use serde::{Deserialize, Deserializer, Serialize};
6use serde_with::skip_serializing_none;
7use std::fmt::{self, Formatter};
8
9#[non_exhaustive]
11#[skip_serializing_none]
12#[derive(Clone, Debug, PartialEq, Serialize)]
13pub struct MetricsScalarQuery {
14 #[serde(rename = "aggregator")]
16 pub aggregator: crate::datadogV2::model::MetricsAggregator,
17 #[serde(rename = "data_source")]
19 pub data_source: crate::datadogV2::model::MetricsDataSource,
20 #[serde(rename = "name")]
22 pub name: Option<String>,
23 #[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}