use serde::{Deserialize, Serialize};
use crate::model::{
extensions::Extensions,
parameter::Parameter,
paths::{method::Method, operation::Operation},
reference::RefOr,
server::Server,
};
#[cfg(feature = "openapi32")]
use crate::Map;
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct PathItem {
#[serde(rename = "$ref", default, skip_serializing_if = "Option::is_none")]
pub reference: Option<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(default, skip_serializing_if = "Option::is_none")]
pub get: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub put: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub post: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delete: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub options: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub head: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub patch: Option<Box<Operation>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trace: Option<Box<Operation>>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub query: Option<Box<Operation>>,
#[cfg(feature = "openapi32")]
#[serde(
rename = "additionalOperations",
default,
skip_serializing_if = "Map::is_empty"
)]
pub additional_operations: Map<Box<Operation>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub servers: Vec<Server>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub parameters: Vec<RefOr<Parameter>>,
#[serde(flatten)]
pub extensions: Extensions,
}
impl PathItem {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn operation(&self, method: Method) -> Option<&Operation> {
match method {
Method::Get => self.get.as_deref(),
Method::Put => self.put.as_deref(),
Method::Post => self.post.as_deref(),
Method::Delete => self.delete.as_deref(),
Method::Options => self.options.as_deref(),
Method::Head => self.head.as_deref(),
Method::Patch => self.patch.as_deref(),
Method::Trace => self.trace.as_deref(),
#[cfg(feature = "openapi32")]
Method::Query => self.query.as_deref(),
}
}
pub fn set_operation(&mut self, method: Method, operation: Operation) -> Option<Operation> {
let slot = match method {
Method::Get => &mut self.get,
Method::Put => &mut self.put,
Method::Post => &mut self.post,
Method::Delete => &mut self.delete,
Method::Options => &mut self.options,
Method::Head => &mut self.head,
Method::Patch => &mut self.patch,
Method::Trace => &mut self.trace,
#[cfg(feature = "openapi32")]
Method::Query => &mut self.query,
};
slot.replace(Box::new(operation)).map(|boxed| *boxed)
}
pub fn operations(&self) -> impl Iterator<Item = (Method, &Operation)> {
Method::all()
.iter()
.filter_map(move |&method| self.operation(method).map(|op| (method, op)))
}
#[must_use]
pub fn with_operation(mut self, method: Method, operation: Operation) -> Self {
self.set_operation(method, operation);
self
}
}