1use crate::datadog;
5use async_stream::try_stream;
6use flate2::{
7 write::{GzEncoder, ZlibEncoder},
8 Compression,
9};
10use futures_core::stream::Stream;
11use reqwest::header::{HeaderMap, HeaderValue};
12use serde::{Deserialize, Serialize};
13use std::io::Write;
14
15#[non_exhaustive]
17#[derive(Clone, Default, Debug)]
18pub struct GetServiceDefinitionOptionalParams {
19 pub schema_version: Option<crate::datadogV2::model::ServiceDefinitionSchemaVersions>,
21}
22
23impl GetServiceDefinitionOptionalParams {
24 pub fn schema_version(
26 mut self,
27 value: crate::datadogV2::model::ServiceDefinitionSchemaVersions,
28 ) -> Self {
29 self.schema_version = Some(value);
30 self
31 }
32}
33
34#[non_exhaustive]
36#[derive(Clone, Default, Debug)]
37pub struct ListServiceDefinitionsOptionalParams {
38 pub page_size: Option<i64>,
40 pub page_number: Option<i64>,
42 pub schema_version: Option<crate::datadogV2::model::ServiceDefinitionSchemaVersions>,
44}
45
46impl ListServiceDefinitionsOptionalParams {
47 pub fn page_size(mut self, value: i64) -> Self {
49 self.page_size = Some(value);
50 self
51 }
52 pub fn page_number(mut self, value: i64) -> Self {
54 self.page_number = Some(value);
55 self
56 }
57 pub fn schema_version(
59 mut self,
60 value: crate::datadogV2::model::ServiceDefinitionSchemaVersions,
61 ) -> Self {
62 self.schema_version = Some(value);
63 self
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69#[serde(untagged)]
70pub enum CreateOrUpdateServiceDefinitionsError {
71 APIErrorResponse(crate::datadogV2::model::APIErrorResponse),
72 UnknownValue(serde_json::Value),
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77#[serde(untagged)]
78pub enum DeleteServiceDefinitionError {
79 APIErrorResponse(crate::datadogV2::model::APIErrorResponse),
80 UnknownValue(serde_json::Value),
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(untagged)]
86pub enum GetServiceDefinitionError {
87 APIErrorResponse(crate::datadogV2::model::APIErrorResponse),
88 UnknownValue(serde_json::Value),
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93#[serde(untagged)]
94pub enum ListServiceDefinitionsError {
95 APIErrorResponse(crate::datadogV2::model::APIErrorResponse),
96 UnknownValue(serde_json::Value),
97}
98
99#[derive(Debug, Clone)]
102pub struct ServiceDefinitionAPI {
103 config: datadog::Configuration,
104 client: reqwest_middleware::ClientWithMiddleware,
105}
106
107impl Default for ServiceDefinitionAPI {
108 fn default() -> Self {
109 Self::with_config(datadog::Configuration::default())
110 }
111}
112
113impl ServiceDefinitionAPI {
114 pub fn new() -> Self {
115 Self::default()
116 }
117 pub fn with_config(config: datadog::Configuration) -> Self {
118 let mut reqwest_client_builder = reqwest::Client::builder();
119
120 if let Some(proxy_url) = &config.proxy_url {
121 let proxy = reqwest::Proxy::all(proxy_url).expect("Failed to parse proxy URL");
122 reqwest_client_builder = reqwest_client_builder.proxy(proxy);
123 }
124
125 let mut middleware_client_builder =
126 reqwest_middleware::ClientBuilder::new(reqwest_client_builder.build().unwrap());
127
128 if config.enable_retry {
129 struct RetryableStatus;
130 impl reqwest_retry::RetryableStrategy for RetryableStatus {
131 fn handle(
132 &self,
133 res: &Result<reqwest::Response, reqwest_middleware::Error>,
134 ) -> Option<reqwest_retry::Retryable> {
135 match res {
136 Ok(success) => reqwest_retry::default_on_request_success(success),
137 Err(_) => None,
138 }
139 }
140 }
141 let backoff_policy = reqwest_retry::policies::ExponentialBackoff::builder()
142 .build_with_max_retries(config.max_retries);
143
144 let retry_middleware =
145 reqwest_retry::RetryTransientMiddleware::new_with_policy_and_strategy(
146 backoff_policy,
147 RetryableStatus,
148 );
149
150 middleware_client_builder = middleware_client_builder.with(retry_middleware);
151 }
152
153 let client = middleware_client_builder.build();
154
155 Self { config, client }
156 }
157
158 pub fn with_client_and_config(
159 config: datadog::Configuration,
160 client: reqwest_middleware::ClientWithMiddleware,
161 ) -> Self {
162 Self { config, client }
163 }
164
165 pub async fn create_or_update_service_definitions(
167 &self,
168 body: crate::datadogV2::model::ServiceDefinitionsCreateRequest,
169 ) -> Result<
170 crate::datadogV2::model::ServiceDefinitionCreateResponse,
171 datadog::Error<CreateOrUpdateServiceDefinitionsError>,
172 > {
173 match self
174 .create_or_update_service_definitions_with_http_info(body)
175 .await
176 {
177 Ok(response_content) => {
178 if let Some(e) = response_content.entity {
179 Ok(e)
180 } else {
181 Err(datadog::Error::Serde(serde::de::Error::custom(
182 "response content was None",
183 )))
184 }
185 }
186 Err(err) => Err(err),
187 }
188 }
189
190 pub async fn create_or_update_service_definitions_with_http_info(
192 &self,
193 body: crate::datadogV2::model::ServiceDefinitionsCreateRequest,
194 ) -> Result<
195 datadog::ResponseContent<crate::datadogV2::model::ServiceDefinitionCreateResponse>,
196 datadog::Error<CreateOrUpdateServiceDefinitionsError>,
197 > {
198 let local_configuration = &self.config;
199 let operation_id = "v2.create_or_update_service_definitions";
200
201 let local_client = &self.client;
202
203 let local_uri_str = format!(
204 "{}/api/v2/services/definitions",
205 local_configuration.get_operation_host(operation_id)
206 );
207 let mut local_req_builder =
208 local_client.request(reqwest::Method::POST, local_uri_str.as_str());
209
210 let mut headers = HeaderMap::new();
212 headers.insert("Content-Type", HeaderValue::from_static("application/json"));
213 headers.insert("Accept", HeaderValue::from_static("application/json"));
214
215 match HeaderValue::from_str(local_configuration.user_agent.as_str()) {
217 Ok(user_agent) => headers.insert(reqwest::header::USER_AGENT, user_agent),
218 Err(e) => {
219 log::warn!("Failed to parse user agent header: {e}, falling back to default");
220 headers.insert(
221 reqwest::header::USER_AGENT,
222 HeaderValue::from_static(datadog::DEFAULT_USER_AGENT.as_str()),
223 )
224 }
225 };
226
227 if let Some(local_key) = local_configuration.auth_keys.get("apiKeyAuth") {
229 headers.insert(
230 "DD-API-KEY",
231 HeaderValue::from_str(local_key.key.as_str())
232 .expect("failed to parse DD-API-KEY header"),
233 );
234 };
235 if let Some(local_key) = local_configuration.auth_keys.get("appKeyAuth") {
236 headers.insert(
237 "DD-APPLICATION-KEY",
238 HeaderValue::from_str(local_key.key.as_str())
239 .expect("failed to parse DD-APPLICATION-KEY header"),
240 );
241 };
242
243 let output = Vec::new();
245 let mut ser = serde_json::Serializer::with_formatter(output, datadog::DDFormatter);
246 if body.serialize(&mut ser).is_ok() {
247 if let Some(content_encoding) = headers.get("Content-Encoding") {
248 match content_encoding.to_str().unwrap_or_default() {
249 "gzip" => {
250 let mut enc = GzEncoder::new(Vec::new(), Compression::default());
251 let _ = enc.write_all(ser.into_inner().as_slice());
252 match enc.finish() {
253 Ok(buf) => {
254 local_req_builder = local_req_builder.body(buf);
255 }
256 Err(e) => return Err(datadog::Error::Io(e)),
257 }
258 }
259 "deflate" => {
260 let mut enc = ZlibEncoder::new(Vec::new(), Compression::default());
261 let _ = enc.write_all(ser.into_inner().as_slice());
262 match enc.finish() {
263 Ok(buf) => {
264 local_req_builder = local_req_builder.body(buf);
265 }
266 Err(e) => return Err(datadog::Error::Io(e)),
267 }
268 }
269 "zstd1" => {
270 let mut enc = zstd::stream::Encoder::new(Vec::new(), 0).unwrap();
271 let _ = enc.write_all(ser.into_inner().as_slice());
272 match enc.finish() {
273 Ok(buf) => {
274 local_req_builder = local_req_builder.body(buf);
275 }
276 Err(e) => return Err(datadog::Error::Io(e)),
277 }
278 }
279 _ => {
280 local_req_builder = local_req_builder.body(ser.into_inner());
281 }
282 }
283 } else {
284 local_req_builder = local_req_builder.body(ser.into_inner());
285 }
286 }
287
288 local_req_builder = local_req_builder.headers(headers);
289 let local_req = local_req_builder.build()?;
290 log::debug!("request content: {:?}", local_req.body());
291 let local_resp = local_client.execute(local_req).await?;
292
293 let local_status = local_resp.status();
294 let local_content = local_resp.text().await?;
295 log::debug!("response content: {}", local_content);
296
297 if !local_status.is_client_error() && !local_status.is_server_error() {
298 match serde_json::from_str::<crate::datadogV2::model::ServiceDefinitionCreateResponse>(
299 &local_content,
300 ) {
301 Ok(e) => {
302 return Ok(datadog::ResponseContent {
303 status: local_status,
304 content: local_content,
305 entity: Some(e),
306 })
307 }
308 Err(e) => return Err(datadog::Error::Serde(e)),
309 };
310 } else {
311 let local_entity: Option<CreateOrUpdateServiceDefinitionsError> =
312 serde_json::from_str(&local_content).ok();
313 let local_error = datadog::ResponseContent {
314 status: local_status,
315 content: local_content,
316 entity: local_entity,
317 };
318 Err(datadog::Error::ResponseError(local_error))
319 }
320 }
321
322 pub async fn delete_service_definition(
324 &self,
325 service_name: String,
326 ) -> Result<(), datadog::Error<DeleteServiceDefinitionError>> {
327 match self
328 .delete_service_definition_with_http_info(service_name)
329 .await
330 {
331 Ok(_) => Ok(()),
332 Err(err) => Err(err),
333 }
334 }
335
336 pub async fn delete_service_definition_with_http_info(
338 &self,
339 service_name: String,
340 ) -> Result<datadog::ResponseContent<()>, datadog::Error<DeleteServiceDefinitionError>> {
341 let local_configuration = &self.config;
342 let operation_id = "v2.delete_service_definition";
343
344 let local_client = &self.client;
345
346 let local_uri_str = format!(
347 "{}/api/v2/services/definitions/{service_name}",
348 local_configuration.get_operation_host(operation_id),
349 service_name = datadog::urlencode(service_name)
350 );
351 let mut local_req_builder =
352 local_client.request(reqwest::Method::DELETE, local_uri_str.as_str());
353
354 let mut headers = HeaderMap::new();
356 headers.insert("Accept", HeaderValue::from_static("*/*"));
357
358 match HeaderValue::from_str(local_configuration.user_agent.as_str()) {
360 Ok(user_agent) => headers.insert(reqwest::header::USER_AGENT, user_agent),
361 Err(e) => {
362 log::warn!("Failed to parse user agent header: {e}, falling back to default");
363 headers.insert(
364 reqwest::header::USER_AGENT,
365 HeaderValue::from_static(datadog::DEFAULT_USER_AGENT.as_str()),
366 )
367 }
368 };
369
370 if let Some(local_key) = local_configuration.auth_keys.get("apiKeyAuth") {
372 headers.insert(
373 "DD-API-KEY",
374 HeaderValue::from_str(local_key.key.as_str())
375 .expect("failed to parse DD-API-KEY header"),
376 );
377 };
378 if let Some(local_key) = local_configuration.auth_keys.get("appKeyAuth") {
379 headers.insert(
380 "DD-APPLICATION-KEY",
381 HeaderValue::from_str(local_key.key.as_str())
382 .expect("failed to parse DD-APPLICATION-KEY header"),
383 );
384 };
385
386 local_req_builder = local_req_builder.headers(headers);
387 let local_req = local_req_builder.build()?;
388 log::debug!("request content: {:?}", local_req.body());
389 let local_resp = local_client.execute(local_req).await?;
390
391 let local_status = local_resp.status();
392 let local_content = local_resp.text().await?;
393 log::debug!("response content: {}", local_content);
394
395 if !local_status.is_client_error() && !local_status.is_server_error() {
396 Ok(datadog::ResponseContent {
397 status: local_status,
398 content: local_content,
399 entity: None,
400 })
401 } else {
402 let local_entity: Option<DeleteServiceDefinitionError> =
403 serde_json::from_str(&local_content).ok();
404 let local_error = datadog::ResponseContent {
405 status: local_status,
406 content: local_content,
407 entity: local_entity,
408 };
409 Err(datadog::Error::ResponseError(local_error))
410 }
411 }
412
413 pub async fn get_service_definition(
415 &self,
416 service_name: String,
417 params: GetServiceDefinitionOptionalParams,
418 ) -> Result<
419 crate::datadogV2::model::ServiceDefinitionGetResponse,
420 datadog::Error<GetServiceDefinitionError>,
421 > {
422 match self
423 .get_service_definition_with_http_info(service_name, params)
424 .await
425 {
426 Ok(response_content) => {
427 if let Some(e) = response_content.entity {
428 Ok(e)
429 } else {
430 Err(datadog::Error::Serde(serde::de::Error::custom(
431 "response content was None",
432 )))
433 }
434 }
435 Err(err) => Err(err),
436 }
437 }
438
439 pub async fn get_service_definition_with_http_info(
441 &self,
442 service_name: String,
443 params: GetServiceDefinitionOptionalParams,
444 ) -> Result<
445 datadog::ResponseContent<crate::datadogV2::model::ServiceDefinitionGetResponse>,
446 datadog::Error<GetServiceDefinitionError>,
447 > {
448 let local_configuration = &self.config;
449 let operation_id = "v2.get_service_definition";
450
451 let schema_version = params.schema_version;
453
454 let local_client = &self.client;
455
456 let local_uri_str = format!(
457 "{}/api/v2/services/definitions/{service_name}",
458 local_configuration.get_operation_host(operation_id),
459 service_name = datadog::urlencode(service_name)
460 );
461 let mut local_req_builder =
462 local_client.request(reqwest::Method::GET, local_uri_str.as_str());
463
464 if let Some(ref local_query_param) = schema_version {
465 local_req_builder =
466 local_req_builder.query(&[("schema_version", &local_query_param.to_string())]);
467 };
468
469 let mut headers = HeaderMap::new();
471 headers.insert("Accept", HeaderValue::from_static("application/json"));
472
473 match HeaderValue::from_str(local_configuration.user_agent.as_str()) {
475 Ok(user_agent) => headers.insert(reqwest::header::USER_AGENT, user_agent),
476 Err(e) => {
477 log::warn!("Failed to parse user agent header: {e}, falling back to default");
478 headers.insert(
479 reqwest::header::USER_AGENT,
480 HeaderValue::from_static(datadog::DEFAULT_USER_AGENT.as_str()),
481 )
482 }
483 };
484
485 if let Some(local_key) = local_configuration.auth_keys.get("apiKeyAuth") {
487 headers.insert(
488 "DD-API-KEY",
489 HeaderValue::from_str(local_key.key.as_str())
490 .expect("failed to parse DD-API-KEY header"),
491 );
492 };
493 if let Some(local_key) = local_configuration.auth_keys.get("appKeyAuth") {
494 headers.insert(
495 "DD-APPLICATION-KEY",
496 HeaderValue::from_str(local_key.key.as_str())
497 .expect("failed to parse DD-APPLICATION-KEY header"),
498 );
499 };
500
501 local_req_builder = local_req_builder.headers(headers);
502 let local_req = local_req_builder.build()?;
503 log::debug!("request content: {:?}", local_req.body());
504 let local_resp = local_client.execute(local_req).await?;
505
506 let local_status = local_resp.status();
507 let local_content = local_resp.text().await?;
508 log::debug!("response content: {}", local_content);
509
510 if !local_status.is_client_error() && !local_status.is_server_error() {
511 match serde_json::from_str::<crate::datadogV2::model::ServiceDefinitionGetResponse>(
512 &local_content,
513 ) {
514 Ok(e) => {
515 return Ok(datadog::ResponseContent {
516 status: local_status,
517 content: local_content,
518 entity: Some(e),
519 })
520 }
521 Err(e) => return Err(datadog::Error::Serde(e)),
522 };
523 } else {
524 let local_entity: Option<GetServiceDefinitionError> =
525 serde_json::from_str(&local_content).ok();
526 let local_error = datadog::ResponseContent {
527 status: local_status,
528 content: local_content,
529 entity: local_entity,
530 };
531 Err(datadog::Error::ResponseError(local_error))
532 }
533 }
534
535 pub async fn list_service_definitions(
537 &self,
538 params: ListServiceDefinitionsOptionalParams,
539 ) -> Result<
540 crate::datadogV2::model::ServiceDefinitionsListResponse,
541 datadog::Error<ListServiceDefinitionsError>,
542 > {
543 match self.list_service_definitions_with_http_info(params).await {
544 Ok(response_content) => {
545 if let Some(e) = response_content.entity {
546 Ok(e)
547 } else {
548 Err(datadog::Error::Serde(serde::de::Error::custom(
549 "response content was None",
550 )))
551 }
552 }
553 Err(err) => Err(err),
554 }
555 }
556
557 pub fn list_service_definitions_with_pagination(
558 &self,
559 mut params: ListServiceDefinitionsOptionalParams,
560 ) -> impl Stream<
561 Item = Result<
562 crate::datadogV2::model::ServiceDefinitionData,
563 datadog::Error<ListServiceDefinitionsError>,
564 >,
565 > + '_ {
566 try_stream! {
567 let mut page_size: i64 = 10;
568 if params.page_size.is_none() {
569 params.page_size = Some(page_size);
570 } else {
571 page_size = params.page_size.unwrap().clone();
572 }
573 if params.page_number.is_none() {
574 params.page_number = Some(0);
575 }
576 loop {
577 let resp = self.list_service_definitions(params.clone()).await?;
578 let Some(data) = resp.data else { break };
579
580 let r = data;
581 let count = r.len();
582 for team in r {
583 yield team;
584 }
585
586 if count < page_size as usize {
587 break;
588 }
589 params.page_number = Some(params.page_number.unwrap() + 1);
590 }
591 }
592 }
593
594 pub async fn list_service_definitions_with_http_info(
596 &self,
597 params: ListServiceDefinitionsOptionalParams,
598 ) -> Result<
599 datadog::ResponseContent<crate::datadogV2::model::ServiceDefinitionsListResponse>,
600 datadog::Error<ListServiceDefinitionsError>,
601 > {
602 let local_configuration = &self.config;
603 let operation_id = "v2.list_service_definitions";
604
605 let page_size = params.page_size;
607 let page_number = params.page_number;
608 let schema_version = params.schema_version;
609
610 let local_client = &self.client;
611
612 let local_uri_str = format!(
613 "{}/api/v2/services/definitions",
614 local_configuration.get_operation_host(operation_id)
615 );
616 let mut local_req_builder =
617 local_client.request(reqwest::Method::GET, local_uri_str.as_str());
618
619 if let Some(ref local_query_param) = page_size {
620 local_req_builder =
621 local_req_builder.query(&[("page[size]", &local_query_param.to_string())]);
622 };
623 if let Some(ref local_query_param) = page_number {
624 local_req_builder =
625 local_req_builder.query(&[("page[number]", &local_query_param.to_string())]);
626 };
627 if let Some(ref local_query_param) = schema_version {
628 local_req_builder =
629 local_req_builder.query(&[("schema_version", &local_query_param.to_string())]);
630 };
631
632 let mut headers = HeaderMap::new();
634 headers.insert("Accept", HeaderValue::from_static("application/json"));
635
636 match HeaderValue::from_str(local_configuration.user_agent.as_str()) {
638 Ok(user_agent) => headers.insert(reqwest::header::USER_AGENT, user_agent),
639 Err(e) => {
640 log::warn!("Failed to parse user agent header: {e}, falling back to default");
641 headers.insert(
642 reqwest::header::USER_AGENT,
643 HeaderValue::from_static(datadog::DEFAULT_USER_AGENT.as_str()),
644 )
645 }
646 };
647
648 if let Some(local_key) = local_configuration.auth_keys.get("apiKeyAuth") {
650 headers.insert(
651 "DD-API-KEY",
652 HeaderValue::from_str(local_key.key.as_str())
653 .expect("failed to parse DD-API-KEY header"),
654 );
655 };
656 if let Some(local_key) = local_configuration.auth_keys.get("appKeyAuth") {
657 headers.insert(
658 "DD-APPLICATION-KEY",
659 HeaderValue::from_str(local_key.key.as_str())
660 .expect("failed to parse DD-APPLICATION-KEY header"),
661 );
662 };
663
664 local_req_builder = local_req_builder.headers(headers);
665 let local_req = local_req_builder.build()?;
666 log::debug!("request content: {:?}", local_req.body());
667 let local_resp = local_client.execute(local_req).await?;
668
669 let local_status = local_resp.status();
670 let local_content = local_resp.text().await?;
671 log::debug!("response content: {}", local_content);
672
673 if !local_status.is_client_error() && !local_status.is_server_error() {
674 match serde_json::from_str::<crate::datadogV2::model::ServiceDefinitionsListResponse>(
675 &local_content,
676 ) {
677 Ok(e) => {
678 return Ok(datadog::ResponseContent {
679 status: local_status,
680 content: local_content,
681 entity: Some(e),
682 })
683 }
684 Err(e) => return Err(datadog::Error::Serde(e)),
685 };
686 } else {
687 let local_entity: Option<ListServiceDefinitionsError> =
688 serde_json::from_str(&local_content).ok();
689 let local_error = datadog::ResponseContent {
690 status: local_status,
691 content: local_content,
692 entity: local_entity,
693 };
694 Err(datadog::Error::ResponseError(local_error))
695 }
696 }
697}