datadog_api_client/datadogV2/model/
model_dataset_request.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/// **Datasets Object Constraints**
10/// - **Tag limit per dataset**:
11///   - Each restricted dataset supports a maximum of 10 key:value pairs per product.
12///
13/// - **Tag key rules per telemetry type**:
14///   - Only one tag key or attribute may be used to define access within a single telemetry type.
15///   - The same or different tag key may be used across different telemetry types.
16///
17/// - **Tag value uniqueness**:
18///   - Tag values must be unique within a single dataset.
19///   - A tag value used in one dataset cannot be reused in another dataset of the same telemetry type.
20#[non_exhaustive]
21#[skip_serializing_none]
22#[derive(Clone, Debug, PartialEq, Serialize)]
23pub struct DatasetRequest {
24    /// Dataset metadata and configurations.
25    #[serde(rename = "attributes")]
26    pub attributes: crate::datadogV2::model::DatasetAttributesRequest,
27    /// Resource type, always "dataset".
28    #[serde(rename = "type")]
29    pub type_: String,
30    #[serde(flatten)]
31    pub additional_properties: std::collections::BTreeMap<String, serde_json::Value>,
32    #[serde(skip)]
33    #[serde(default)]
34    pub(crate) _unparsed: bool,
35}
36
37impl DatasetRequest {
38    pub fn new(
39        attributes: crate::datadogV2::model::DatasetAttributesRequest,
40        type_: String,
41    ) -> DatasetRequest {
42        DatasetRequest {
43            attributes,
44            type_,
45            additional_properties: std::collections::BTreeMap::new(),
46            _unparsed: false,
47        }
48    }
49
50    pub fn additional_properties(
51        mut self,
52        value: std::collections::BTreeMap<String, serde_json::Value>,
53    ) -> Self {
54        self.additional_properties = value;
55        self
56    }
57}
58
59impl<'de> Deserialize<'de> for DatasetRequest {
60    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
61    where
62        D: Deserializer<'de>,
63    {
64        struct DatasetRequestVisitor;
65        impl<'a> Visitor<'a> for DatasetRequestVisitor {
66            type Value = DatasetRequest;
67
68            fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
69                f.write_str("a mapping")
70            }
71
72            fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
73            where
74                M: MapAccess<'a>,
75            {
76                let mut attributes: Option<crate::datadogV2::model::DatasetAttributesRequest> =
77                    None;
78                let mut type_: Option<String> = None;
79                let mut additional_properties: std::collections::BTreeMap<
80                    String,
81                    serde_json::Value,
82                > = std::collections::BTreeMap::new();
83                let mut _unparsed = false;
84
85                while let Some((k, v)) = map.next_entry::<String, serde_json::Value>()? {
86                    match k.as_str() {
87                        "attributes" => {
88                            attributes = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
89                        }
90                        "type" => {
91                            type_ = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
92                        }
93                        &_ => {
94                            if let Ok(value) = serde_json::from_value(v.clone()) {
95                                additional_properties.insert(k, value);
96                            }
97                        }
98                    }
99                }
100                let attributes = attributes.ok_or_else(|| M::Error::missing_field("attributes"))?;
101                let type_ = type_.ok_or_else(|| M::Error::missing_field("type_"))?;
102
103                let content = DatasetRequest {
104                    attributes,
105                    type_,
106                    additional_properties,
107                    _unparsed,
108                };
109
110                Ok(content)
111            }
112        }
113
114        deserializer.deserialize_any(DatasetRequestVisitor)
115    }
116}