kynos_openapi/model/paths/
operation.rs1use serde::{Deserialize, Serialize};
4
5use crate::{
6 Map,
7 model::{
8 body::RequestBody, callback::Callback, extensions::Extensions,
9 external_docs::ExternalDocumentation, parameter::Parameter, reference::RefOr,
10 response::Responses, security::requirement::SecurityRequirement, server::Server,
11 },
12};
13
14#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
16pub struct Operation {
17 #[serde(default, skip_serializing_if = "Vec::is_empty")]
19 pub tags: Vec<String>,
20
21 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub summary: Option<String>,
24
25 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub description: Option<String>,
30
31 #[serde(
33 rename = "externalDocs",
34 default,
35 skip_serializing_if = "Option::is_none"
36 )]
37 pub external_docs: Option<ExternalDocumentation>,
38
39 #[serde(
45 rename = "operationId",
46 default,
47 skip_serializing_if = "Option::is_none"
48 )]
49 pub operation_id: Option<String>,
50
51 #[serde(default, skip_serializing_if = "Vec::is_empty")]
57 pub parameters: Vec<RefOr<Parameter>>,
58
59 #[serde(
61 rename = "requestBody",
62 default,
63 skip_serializing_if = "Option::is_none"
64 )]
65 pub request_body: Option<RefOr<RequestBody>>,
66
67 #[serde(default, skip_serializing_if = "Responses::is_empty")]
69 pub responses: Responses,
70
71 #[serde(default, skip_serializing_if = "Map::is_empty")]
73 pub callbacks: Map<RefOr<Callback>>,
74
75 #[serde(default, skip_serializing_if = "Option::is_none")]
77 pub deprecated: Option<bool>,
78
79 #[serde(default, skip_serializing_if = "Option::is_none")]
84 pub security: Option<Vec<SecurityRequirement>>,
85
86 #[serde(default, skip_serializing_if = "Vec::is_empty")]
88 pub servers: Vec<Server>,
89
90 #[serde(flatten)]
92 pub extensions: Extensions,
93}
94
95impl Operation {
96 pub fn new(operation_id: impl Into<String>) -> Self {
98 Self {
99 operation_id: Some(operation_id.into()),
100 ..Self::default()
101 }
102 }
103
104 #[must_use]
106 pub fn with_summary(mut self, summary: impl Into<String>) -> Self {
107 self.summary = Some(summary.into());
108 self
109 }
110
111 #[must_use]
113 pub fn with_description(mut self, description: impl Into<String>) -> Self {
114 self.description = Some(description.into());
115 self
116 }
117
118 #[must_use]
120 pub fn with_tag(mut self, tag: impl Into<String>) -> Self {
121 self.tags.push(tag.into());
122 self
123 }
124
125 #[must_use]
127 pub fn with_parameter(mut self, parameter: Parameter) -> Self {
128 self.parameters.push(RefOr::Item(parameter));
129 self
130 }
131
132 #[must_use]
134 pub fn with_request_body(mut self, body: RequestBody) -> Self {
135 self.request_body = Some(RefOr::Item(body));
136 self
137 }
138
139 #[must_use]
141 pub fn with_responses(mut self, responses: Responses) -> Self {
142 self.responses = responses;
143 self
144 }
145
146 #[must_use]
148 pub fn with_security(mut self, requirement: SecurityRequirement) -> Self {
149 self.security.get_or_insert_with(Vec::new).push(requirement);
150 self
151 }
152
153 #[must_use]
155 pub fn deprecated(mut self) -> Self {
156 self.deprecated = Some(true);
157 self
158 }
159}