icinga2_api/api/action/
add_comment.rs1use serde::{Deserialize, Serialize};
6
7use crate::serde::{deserialize_optional_icinga_timestamp, serialize_optional_icinga_timestamp};
8use crate::types::action::StatusResponse;
9use crate::types::enums::object_type::IcingaObjectType;
10use crate::types::filter::IcingaFilter;
11use crate::types::query::ResultsWrapper;
12use crate::types::rest::{RestApiEndpoint, RestApiResponse};
13
14#[derive(Debug, Clone, derive_builder::Builder, Serialize, Deserialize)]
16#[builder(
17 build_fn(error = "crate::error::Error", validate = "Self::validate"),
18 derive(Debug)
19)]
20pub struct AddComment {
21 author: String,
23 comment: String,
25 #[serde(
27 serialize_with = "serialize_optional_icinga_timestamp",
28 deserialize_with = "deserialize_optional_icinga_timestamp"
29 )]
30 expiry: Option<time::OffsetDateTime>,
31 #[builder(default, setter(strip_option, into))]
33 #[serde(flatten)]
34 filter: Option<IcingaFilter>,
35}
36
37impl AddComment {
38 #[must_use]
42 pub fn builder() -> AddCommentBuilder {
43 AddCommentBuilder::default()
44 }
45}
46
47impl AddCommentBuilder {
48 pub fn validate(&self) -> Result<(), crate::error::Error> {
54 if let Some(Some(filter)) = &self.filter {
55 if filter.object_type != IcingaObjectType::Host
56 && filter.object_type != IcingaObjectType::Service
57 {
58 Err(crate::error::Error::FilterObjectTypeMismatch(
59 vec![IcingaObjectType::Host, IcingaObjectType::Service],
60 filter.object_type.to_owned(),
61 ))
62 } else {
63 Ok(())
64 }
65 } else {
66 Ok(())
67 }
68 }
69}
70
71impl RestApiEndpoint for AddComment {
72 type RequestBody = AddComment;
73
74 fn method(&self) -> Result<reqwest::Method, crate::error::Error> {
75 Ok(reqwest::Method::POST)
76 }
77
78 fn url(&self, base_url: &url::Url) -> Result<url::Url, crate::error::Error> {
79 base_url
80 .join("v1/actions/add-comment")
81 .map_err(crate::error::Error::CouldNotParseUrlFragment)
82 }
83
84 fn request_body(
85 &self,
86 ) -> Result<Option<std::borrow::Cow<Self::RequestBody>>, crate::error::Error>
87 where
88 Self::RequestBody: Clone + serde::Serialize + std::fmt::Debug,
89 {
90 Ok(Some(std::borrow::Cow::Borrowed(self)))
91 }
92}
93
94impl RestApiResponse<AddComment> for ResultsWrapper<StatusResponse> {}