use super::resolver::{Resolvable, Resolver};
use super::{ResolvedCallback, ResolvedParameter, ResolvedRequestBody, ResolvedResponse, Shared};
use crate::ResolveError;
use indexmap::IndexMap;
use openapiv3::{
ExternalDocumentation, Operation, Responses, SecurityRequirement, Server, StatusCode,
};
#[derive(Debug, PartialEq)]
pub struct ResolvedOperation {
pub tags: Vec<String>,
pub summary: Option<String>,
pub description: Option<String>,
pub external_docs: Option<ExternalDocumentation>,
pub operation_id: Option<String>,
pub parameters: Vec<Shared<ResolvedParameter>>,
pub request_body: Option<Shared<ResolvedRequestBody>>,
pub responses: ResolvedResponses,
pub callbacks: IndexMap<String, ResolvedCallback>,
pub deprecated: bool,
pub security: Option<Vec<SecurityRequirement>>,
pub servers: Vec<Server>,
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, PartialEq)]
pub struct ResolvedResponses {
pub default: Option<Shared<ResolvedResponse>>,
pub responses: IndexMap<StatusCode, Shared<ResolvedResponse>>,
pub extensions: IndexMap<String, serde_json::Value>,
}
impl Resolvable for Operation {
type Resolved = ResolvedOperation;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedOperation {
tags: self.tags.clone(),
summary: self.summary.clone(),
description: self.description.clone(),
external_docs: self.external_docs.clone(),
operation_id: self.operation_id.clone(),
parameters: cx.ref_or_vec(&self.parameters)?,
request_body: self
.request_body
.as_ref()
.map(|body| cx.ref_or(body))
.transpose()?,
responses: self.responses.resolve_inline(cx)?,
callbacks: super::resolve_map(&self.callbacks, cx)?,
deprecated: self.deprecated,
security: self.security.clone(),
servers: self.servers.clone(),
extensions: self.extensions.clone(),
})
}
}
impl Resolvable for Responses {
type Resolved = ResolvedResponses;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedResponses {
default: self
.default
.as_ref()
.map(|default| cx.ref_or(default))
.transpose()?,
responses: cx.ref_or_map(&self.responses)?,
extensions: self.extensions.clone(),
})
}
}