Skip to main content

spikard_cli/codegen/
schema_index.rs

1use openapiv3::{OpenAPI, ReferenceOr, Schema};
2use std::collections::HashMap;
3
4/// Simple registry that lets generators resolve `$ref` identifiers to concrete schemas.
5#[derive(Debug, Default, Clone)]
6pub struct SchemaRegistry {
7    schemas: HashMap<String, Schema>,
8}
9
10impl SchemaRegistry {
11    /// Build a registry from the `OpenAPI` spec's component schemas.
12    #[must_use]
13    pub fn from_spec(spec: &OpenAPI) -> Self {
14        let mut registry = Self::default();
15        if let Some(components) = &spec.components {
16            for (name, schema_ref) in &components.schemas {
17                if let ReferenceOr::Item(schema) = schema_ref {
18                    registry.schemas.insert(name.clone(), schema.clone());
19                }
20            }
21        }
22        registry
23    }
24
25    /// Lookup the schema identified by a JSON pointer reference (e.g. `#/components/schemas/User`).
26    #[must_use]
27    pub fn resolve_reference(&self, reference: &str) -> Option<&Schema> {
28        reference.rsplit('/').next().and_then(|name| self.schemas.get(name))
29    }
30
31    /// Resolve either inline schemas or `$ref` entries to a `Schema`.
32    #[must_use]
33    pub fn resolve<'a>(&'a self, schema_ref: &'a ReferenceOr<Schema>) -> Option<&'a Schema> {
34        match schema_ref {
35            ReferenceOr::Item(schema) => Some(schema),
36            ReferenceOr::Reference { reference } => self.resolve_reference(reference),
37        }
38    }
39}