use oas3::spec::Spec as OasSpec;
use tracing::debug;
use super::registry::TypeRegistry;
use super::validate::ValidatedDocument;
use crate::error::ValidationError;
use crate::ident::type_ident;
use crate::model::Api;
mod operation;
mod schema;
pub(crate) fn lower_document(document: &ValidatedDocument<'_>) -> Result<Api, ValidationError> {
debug!("lowering API from resolved document");
let spec = document.resolved.spec;
let mut registry = TypeRegistry::default();
let server_url = parse_server_url(spec);
let api_key_security_schemes = operation::parse_api_key_security_schemes(&document.resolved)?;
reserve_component_type_names(document, &mut registry);
let mut schemas = schema::SchemaLowerer::new(document);
let components = schemas.parse_components(&mut registry);
let operations = operation::parse_operations(document, &mut registry, &mut schemas)?;
let (components, constrained_types) = registry.finish(components);
Ok(Api::new(
server_url,
api_key_security_schemes,
components,
constrained_types,
operations,
))
}
fn parse_server_url(spec: &OasSpec) -> String {
spec.servers
.first()
.map(|server| server.url.clone())
.unwrap_or_default()
}
fn reserve_component_type_names(document: &ValidatedDocument<'_>, registry: &mut TypeRegistry) {
for component in &document.components {
registry.reserve(type_ident(&component.schema_name));
}
}