datadog_api_client/datadogV2/model/
model_observability_pipeline_socket_source.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/// The `socket` source ingests logs over TCP or UDP.
10///
11#[non_exhaustive]
12#[skip_serializing_none]
13#[derive(Clone, Debug, PartialEq, Serialize)]
14pub struct ObservabilityPipelineSocketSource {
15    /// Framing method configuration for the socket source.
16    #[serde(rename = "framing")]
17    pub framing: crate::datadogV2::model::ObservabilityPipelineSocketSourceFraming,
18    /// The unique identifier for this component. Used to reference this component in other parts of the pipeline (e.g., as input to downstream components).
19    #[serde(rename = "id")]
20    pub id: String,
21    /// Protocol used to receive logs.
22    #[serde(rename = "mode")]
23    pub mode: crate::datadogV2::model::ObservabilityPipelineSocketSourceMode,
24    /// Configuration for enabling TLS encryption between the pipeline component and external services.
25    #[serde(rename = "tls")]
26    pub tls: Option<crate::datadogV2::model::ObservabilityPipelineTls>,
27    /// The source type. The value should always be `socket`.
28    #[serde(rename = "type")]
29    pub type_: crate::datadogV2::model::ObservabilityPipelineSocketSourceType,
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 ObservabilityPipelineSocketSource {
38    pub fn new(
39        framing: crate::datadogV2::model::ObservabilityPipelineSocketSourceFraming,
40        id: String,
41        mode: crate::datadogV2::model::ObservabilityPipelineSocketSourceMode,
42        type_: crate::datadogV2::model::ObservabilityPipelineSocketSourceType,
43    ) -> ObservabilityPipelineSocketSource {
44        ObservabilityPipelineSocketSource {
45            framing,
46            id,
47            mode,
48            tls: None,
49            type_,
50            additional_properties: std::collections::BTreeMap::new(),
51            _unparsed: false,
52        }
53    }
54
55    pub fn tls(mut self, value: crate::datadogV2::model::ObservabilityPipelineTls) -> Self {
56        self.tls = Some(value);
57        self
58    }
59
60    pub fn additional_properties(
61        mut self,
62        value: std::collections::BTreeMap<String, serde_json::Value>,
63    ) -> Self {
64        self.additional_properties = value;
65        self
66    }
67}
68
69impl<'de> Deserialize<'de> for ObservabilityPipelineSocketSource {
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: Deserializer<'de>,
73    {
74        struct ObservabilityPipelineSocketSourceVisitor;
75        impl<'a> Visitor<'a> for ObservabilityPipelineSocketSourceVisitor {
76            type Value = ObservabilityPipelineSocketSource;
77
78            fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
79                f.write_str("a mapping")
80            }
81
82            fn visit_map<M>(self, mut map: M) -> Result<Self::Value, M::Error>
83            where
84                M: MapAccess<'a>,
85            {
86                let mut framing: Option<
87                    crate::datadogV2::model::ObservabilityPipelineSocketSourceFraming,
88                > = None;
89                let mut id: Option<String> = None;
90                let mut mode: Option<
91                    crate::datadogV2::model::ObservabilityPipelineSocketSourceMode,
92                > = None;
93                let mut tls: Option<crate::datadogV2::model::ObservabilityPipelineTls> = None;
94                let mut type_: Option<
95                    crate::datadogV2::model::ObservabilityPipelineSocketSourceType,
96                > = None;
97                let mut additional_properties: std::collections::BTreeMap<
98                    String,
99                    serde_json::Value,
100                > = std::collections::BTreeMap::new();
101                let mut _unparsed = false;
102
103                while let Some((k, v)) = map.next_entry::<String, serde_json::Value>()? {
104                    match k.as_str() {
105                        "framing" => {
106                            framing = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
107                            if let Some(ref _framing) = framing {
108                                match _framing {
109                                    crate::datadogV2::model::ObservabilityPipelineSocketSourceFraming::UnparsedObject(_framing) => {
110                                        _unparsed = true;
111                                    },
112                                    _ => {}
113                                }
114                            }
115                        }
116                        "id" => {
117                            id = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
118                        }
119                        "mode" => {
120                            mode = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
121                            if let Some(ref _mode) = mode {
122                                match _mode {
123                                    crate::datadogV2::model::ObservabilityPipelineSocketSourceMode::UnparsedObject(_mode) => {
124                                        _unparsed = true;
125                                    },
126                                    _ => {}
127                                }
128                            }
129                        }
130                        "tls" => {
131                            if v.is_null() {
132                                continue;
133                            }
134                            tls = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
135                        }
136                        "type" => {
137                            type_ = Some(serde_json::from_value(v).map_err(M::Error::custom)?);
138                            if let Some(ref _type_) = type_ {
139                                match _type_ {
140                                    crate::datadogV2::model::ObservabilityPipelineSocketSourceType::UnparsedObject(_type_) => {
141                                        _unparsed = true;
142                                    },
143                                    _ => {}
144                                }
145                            }
146                        }
147                        &_ => {
148                            if let Ok(value) = serde_json::from_value(v.clone()) {
149                                additional_properties.insert(k, value);
150                            }
151                        }
152                    }
153                }
154                let framing = framing.ok_or_else(|| M::Error::missing_field("framing"))?;
155                let id = id.ok_or_else(|| M::Error::missing_field("id"))?;
156                let mode = mode.ok_or_else(|| M::Error::missing_field("mode"))?;
157                let type_ = type_.ok_or_else(|| M::Error::missing_field("type_"))?;
158
159                let content = ObservabilityPipelineSocketSource {
160                    framing,
161                    id,
162                    mode,
163                    tls,
164                    type_,
165                    additional_properties,
166                    _unparsed,
167                };
168
169                Ok(content)
170            }
171        }
172
173        deserializer.deserialize_any(ObservabilityPipelineSocketSourceVisitor)
174    }
175}