spikard_cli/codegen/
schema_index.rs1use openapiv3::{OpenAPI, ReferenceOr, Schema};
2use std::collections::HashMap;
3
4#[derive(Debug, Default, Clone)]
6pub struct SchemaRegistry {
7 schemas: HashMap<String, Schema>,
8}
9
10impl SchemaRegistry {
11 #[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 #[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 #[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}