use openapiv3::{OpenAPI, ReferenceOr, Schema};
use std::collections::HashMap;
#[derive(Debug, Default, Clone)]
pub struct SchemaRegistry {
schemas: HashMap<String, Schema>,
}
impl SchemaRegistry {
#[must_use]
pub fn from_spec(spec: &OpenAPI) -> Self {
let mut registry = Self::default();
if let Some(components) = &spec.components {
for (name, schema_ref) in &components.schemas {
if let ReferenceOr::Item(schema) = schema_ref {
registry.schemas.insert(name.clone(), schema.clone());
}
}
}
registry
}
#[must_use]
pub fn resolve_reference(&self, reference: &str) -> Option<&Schema> {
reference.rsplit('/').next().and_then(|name| self.schemas.get(name))
}
#[must_use]
pub fn resolve<'a>(&'a self, schema_ref: &'a ReferenceOr<Schema>) -> Option<&'a Schema> {
match schema_ref {
ReferenceOr::Item(schema) => Some(schema),
ReferenceOr::Reference { reference } => self.resolve_reference(reference),
}
}
}