use serde::{Deserialize, Serialize};
use crate::{
Map,
model::{
body::RequestBody, callback::Callback, extensions::Extensions,
external_docs::ExternalDocumentation, parameter::Parameter, reference::RefOr,
response::Responses, security::requirement::SecurityRequirement, server::Server,
},
};
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct Operation {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(
rename = "externalDocs",
default,
skip_serializing_if = "Option::is_none"
)]
pub external_docs: Option<ExternalDocumentation>,
#[serde(
rename = "operationId",
default,
skip_serializing_if = "Option::is_none"
)]
pub operation_id: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parameters: Vec<RefOr<Parameter>>,
#[serde(
rename = "requestBody",
default,
skip_serializing_if = "Option::is_none"
)]
pub request_body: Option<RefOr<RequestBody>>,
#[serde(default, skip_serializing_if = "Responses::is_empty")]
pub responses: Responses,
#[serde(default, skip_serializing_if = "Map::is_empty")]
pub callbacks: Map<RefOr<Callback>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deprecated: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub security: Option<Vec<SecurityRequirement>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub servers: Vec<Server>,
#[serde(flatten)]
pub extensions: Extensions,
}
impl Operation {
pub fn new(operation_id: impl Into<String>) -> Self {
Self {
operation_id: Some(operation_id.into()),
..Self::default()
}
}
#[must_use]
pub fn with_summary(mut self, summary: impl Into<String>) -> Self {
self.summary = Some(summary.into());
self
}
#[must_use]
pub fn with_description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
#[must_use]
pub fn with_tag(mut self, tag: impl Into<String>) -> Self {
self.tags.push(tag.into());
self
}
#[must_use]
pub fn with_parameter(mut self, parameter: Parameter) -> Self {
self.parameters.push(RefOr::Item(parameter));
self
}
#[must_use]
pub fn with_request_body(mut self, body: RequestBody) -> Self {
self.request_body = Some(RefOr::Item(body));
self
}
#[must_use]
pub fn with_responses(mut self, responses: Responses) -> Self {
self.responses = responses;
self
}
#[must_use]
pub fn with_security(mut self, requirement: SecurityRequirement) -> Self {
self.security.get_or_insert_with(Vec::new).push(requirement);
self
}
#[must_use]
pub fn deprecated(mut self) -> Self {
self.deprecated = Some(true);
self
}
}