Skip to main content

openapiv3_resolve/resolved/
components.rs

1use super::resolver::{Resolvable, Resolver};
2use super::{
3    ResolvedCallback, ResolvedHeader, ResolvedParameter, ResolvedRequestBody, ResolvedResponse,
4    ResolvedSchema, Shared,
5};
6use crate::ResolveError;
7use indexmap::IndexMap;
8use openapiv3::{Components, Example, Link, SecurityScheme};
9
10/// [`Components`] with every entry resolved, including entries that were
11/// themselves a `$ref` to another entry.
12#[derive(Debug, PartialEq)]
13pub struct ResolvedComponents {
14    /// See [`Components::schemas`].
15    pub schemas: IndexMap<String, Shared<ResolvedSchema>>,
16    /// See [`Components::responses`].
17    pub responses: IndexMap<String, Shared<ResolvedResponse>>,
18    /// See [`Components::parameters`].
19    pub parameters: IndexMap<String, Shared<ResolvedParameter>>,
20    /// See [`Components::examples`].
21    pub examples: IndexMap<String, Shared<Example>>,
22    /// See [`Components::request_bodies`].
23    pub request_bodies: IndexMap<String, Shared<ResolvedRequestBody>>,
24    /// See [`Components::headers`].
25    pub headers: IndexMap<String, Shared<ResolvedHeader>>,
26    /// See [`Components::security_schemes`].
27    pub security_schemes: IndexMap<String, Shared<SecurityScheme>>,
28    /// See [`Components::links`].
29    pub links: IndexMap<String, Shared<Link>>,
30    /// See [`Components::callbacks`].
31    pub callbacks: IndexMap<String, Shared<ResolvedCallback>>,
32    /// See [`Components::extensions`].
33    pub extensions: IndexMap<String, serde_json::Value>,
34}
35
36impl Resolvable for Components {
37    type Resolved = ResolvedComponents;
38
39    fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
40        Ok(ResolvedComponents {
41            schemas: cx.section(&self.schemas)?,
42            responses: cx.section(&self.responses)?,
43            parameters: cx.section(&self.parameters)?,
44            examples: cx.section(&self.examples)?,
45            request_bodies: cx.section(&self.request_bodies)?,
46            headers: cx.section(&self.headers)?,
47            security_schemes: cx.section(&self.security_schemes)?,
48            links: cx.section(&self.links)?,
49            callbacks: cx.section(&self.callbacks)?,
50            extensions: self.extensions.clone(),
51        })
52    }
53}