use super::resolver::{Resolvable, Resolver};
use super::{ResolvedHeader, ResolvedSchema, Shared};
use crate::ResolveError;
use indexmap::IndexMap;
use openapiv3::{Encoding, Example, Link, MediaType, QueryStyle, RequestBody, Response};
#[derive(Debug, PartialEq)]
pub struct ResolvedRequestBody {
pub description: Option<String>,
pub content: IndexMap<String, ResolvedMediaType>,
pub required: bool,
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, PartialEq)]
pub struct ResolvedResponse {
pub description: String,
pub headers: IndexMap<String, Shared<ResolvedHeader>>,
pub content: IndexMap<String, ResolvedMediaType>,
pub links: IndexMap<String, Shared<Link>>,
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, PartialEq)]
pub struct ResolvedMediaType {
pub schema: Option<Shared<ResolvedSchema>>,
pub example: Option<serde_json::Value>,
pub examples: IndexMap<String, Shared<Example>>,
pub encoding: IndexMap<String, ResolvedEncoding>,
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, PartialEq)]
pub struct ResolvedEncoding {
pub content_type: Option<String>,
pub headers: IndexMap<String, Shared<ResolvedHeader>>,
pub style: Option<QueryStyle>,
pub explode: bool,
pub allow_reserved: bool,
pub extensions: IndexMap<String, serde_json::Value>,
}
impl Resolvable for RequestBody {
type Resolved = ResolvedRequestBody;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedRequestBody {
description: self.description.clone(),
content: super::resolve_map(&self.content, cx)?,
required: self.required,
extensions: self.extensions.clone(),
})
}
}
impl Resolvable for Response {
type Resolved = ResolvedResponse;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedResponse {
description: self.description.clone(),
headers: cx.ref_or_map(&self.headers)?,
content: super::resolve_map(&self.content, cx)?,
links: cx.ref_or_map(&self.links)?,
extensions: self.extensions.clone(),
})
}
}
impl Resolvable for MediaType {
type Resolved = ResolvedMediaType;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedMediaType {
schema: self
.schema
.as_ref()
.map(|schema| cx.ref_or(schema))
.transpose()?,
example: self.example.clone(),
examples: cx.ref_or_map(&self.examples)?,
encoding: super::resolve_map(&self.encoding, cx)?,
extensions: self.extensions.clone(),
})
}
}
impl Resolvable for Encoding {
type Resolved = ResolvedEncoding;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedEncoding {
content_type: self.content_type.clone(),
headers: cx.ref_or_map(&self.headers)?,
style: self.style.clone(),
explode: self.explode,
allow_reserved: self.allow_reserved,
extensions: self.extensions.clone(),
})
}
}