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 set to `dataset`.
28    #[serde(rename = "type")]
29    pub type_: crate::datadogV2::model::DatasetType,
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_: crate::datadogV2::model::DatasetType,
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<crate::datadogV2::model::DatasetType> = 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                            if let Some(ref _type_) = type_ {
93                                match _type_ {
94                                    crate::datadogV2::model::DatasetType::UnparsedObject(
95                                        _type_,
96                                    ) => {
97                                        _unparsed = true;
98                                    }
99                                    _ => {}
100                                }
101                            }
102                        }
103                        &_ => {
104                            if let Ok(value) = serde_json::from_value(v.clone()) {
105                                additional_properties.insert(k, value);
106                            }
107                        }
108                    }
109                }
110                let attributes = attributes.ok_or_else(|| M::Error::missing_field("attributes"))?;
111                let type_ = type_.ok_or_else(|| M::Error::missing_field("type_"))?;
112
113                let content = DatasetRequest {
114                    attributes,
115                    type_,
116                    additional_properties,
117                    _unparsed,
118                };
119
120                Ok(content)
121            }
122        }
123
124        deserializer.deserialize_any(DatasetRequestVisitor)
125    }
126}