use super::resolver::{Resolvable, Resolver};
use super::{NestedSchema, ResolvedAnySchema, ResolvedType};
use crate::ResolveError;
use openapiv3::{AdditionalProperties, Schema, SchemaData, SchemaKind};
#[derive(Debug, PartialEq)]
pub struct ResolvedSchema {
pub schema_data: SchemaData,
pub schema_kind: ResolvedSchemaKind,
}
#[derive(Debug, PartialEq)]
pub enum ResolvedSchemaKind {
Type(ResolvedType),
OneOf {
one_of: Vec<NestedSchema>,
},
AllOf {
all_of: Vec<NestedSchema>,
},
AnyOf {
any_of: Vec<NestedSchema>,
},
Not {
not: NestedSchema,
},
Any(Box<ResolvedAnySchema>),
}
#[derive(Debug, PartialEq)]
pub enum ResolvedAdditionalProperties {
Any(bool),
Schema(NestedSchema),
}
impl Resolvable for Schema {
type Resolved = ResolvedSchema;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(ResolvedSchema {
schema_data: self.schema_data.clone(),
schema_kind: self.schema_kind.resolve_inline(cx)?,
})
}
}
impl Resolvable for SchemaKind {
type Resolved = ResolvedSchemaKind;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(match self {
Self::Type(kind) => ResolvedSchemaKind::Type(kind.resolve_inline(cx)?),
Self::OneOf { one_of } => ResolvedSchemaKind::OneOf {
one_of: cx.nested_vec(one_of)?,
},
Self::AllOf { all_of } => ResolvedSchemaKind::AllOf {
all_of: cx.nested_vec(all_of)?,
},
Self::AnyOf { any_of } => ResolvedSchemaKind::AnyOf {
any_of: cx.nested_vec(any_of)?,
},
Self::Not { not } => ResolvedSchemaKind::Not {
not: cx.nested(not)?,
},
Self::Any(any) => ResolvedSchemaKind::Any(Box::new(any.resolve_inline(cx)?)),
})
}
}
impl Resolvable for AdditionalProperties {
type Resolved = ResolvedAdditionalProperties;
fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
Ok(match self {
Self::Any(allowed) => ResolvedAdditionalProperties::Any(*allowed),
Self::Schema(schema) => ResolvedAdditionalProperties::Schema(cx.nested(schema)?),
})
}
}