use super::resolver::{Resolvable, Resolver};
use super::{ResolvedMediaType, ResolvedSchema, Shared};
use crate::ResolveError;
use indexmap::IndexMap;
use openapiv3::{
CookieStyle, Example, Header, HeaderStyle, Parameter, ParameterData, ParameterSchemaOrContent,
PathStyle, QueryStyle,
};
#[derive(Debug, PartialEq)]
pub enum ResolvedParameter {
Query {
parameter_data: ResolvedParameterData,
allow_reserved: bool,
style: QueryStyle,
allow_empty_value: Option<bool>,
},
Header {
parameter_data: ResolvedParameterData,
style: HeaderStyle,
},
Path {
parameter_data: ResolvedParameterData,
style: PathStyle,
},
Cookie {
parameter_data: ResolvedParameterData,
style: CookieStyle,
},
}
impl ResolvedParameter {
pub fn parameter_data(&self) -> &ResolvedParameterData {
match self {
Self::Query { parameter_data, .. }
| Self::Header { parameter_data, .. }
| Self::Path { parameter_data, .. }
| Self::Cookie { parameter_data, .. } => parameter_data,
}
}
}
#[derive(Debug, PartialEq)]
pub struct ResolvedParameterData {
pub name: String,
pub description: Option<String>,
pub required: bool,
pub deprecated: Option<bool>,
pub format: ResolvedParameterSchemaOrContent,
pub example: Option<serde_json::Value>,
pub examples: IndexMap<String, Shared<Example>>,
pub explode: Option<bool>,
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, PartialEq)]
pub enum ResolvedParameterSchemaOrContent {
Schema(Shared<ResolvedSchema>),
Content(IndexMap<String, ResolvedMediaType>),
}
#[derive(Debug, PartialEq)]
pub struct ResolvedHeader {
pub description: Option<String>,
pub style: HeaderStyle,
pub required: bool,
pub deprecated: Option<bool>,
pub format: ResolvedParameterSchemaOrContent,
pub example: Option<serde_json::Value>,
pub examples: IndexMap<String, Shared<Example>>,
pub extensions: IndexMap<String, serde_json::Value>,
}
impl Resolvable for Parameter {
type Resolved = ResolvedParameter;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(match self {
Self::Query {
parameter_data,
allow_reserved,
style,
allow_empty_value,
} => ResolvedParameter::Query {
parameter_data: parameter_data.resolve_inline(cx)?,
allow_reserved: *allow_reserved,
style: style.clone(),
allow_empty_value: *allow_empty_value,
},
Self::Header {
parameter_data,
style,
} => ResolvedParameter::Header {
parameter_data: parameter_data.resolve_inline(cx)?,
style: style.clone(),
},
Self::Path {
parameter_data,
style,
} => ResolvedParameter::Path {
parameter_data: parameter_data.resolve_inline(cx)?,
style: style.clone(),
},
Self::Cookie {
parameter_data,
style,
} => ResolvedParameter::Cookie {
parameter_data: parameter_data.resolve_inline(cx)?,
style: style.clone(),
},
})
}
}
impl Resolvable for ParameterData {
type Resolved = ResolvedParameterData;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedParameterData {
name: self.name.clone(),
description: self.description.clone(),
required: self.required,
deprecated: self.deprecated,
format: self.format.resolve_inline(cx)?,
example: self.example.clone(),
examples: cx.ref_or_map(&self.examples)?,
explode: self.explode,
extensions: self.extensions.clone(),
})
}
}
impl Resolvable for ParameterSchemaOrContent {
type Resolved = ResolvedParameterSchemaOrContent;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(match self {
Self::Schema(schema) => ResolvedParameterSchemaOrContent::Schema(cx.ref_or(schema)?),
Self::Content(content) => {
ResolvedParameterSchemaOrContent::Content(super::resolve_map(content, cx)?)
}
})
}
}
impl Resolvable for Header {
type Resolved = ResolvedHeader;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedHeader {
description: self.description.clone(),
style: self.style.clone(),
required: self.required,
deprecated: self.deprecated,
format: self.format.resolve_inline(cx)?,
example: self.example.clone(),
examples: cx.ref_or_map(&self.examples)?,
extensions: self.extensions.clone(),
})
}
}