Skip to main content

openapiv3_resolve/resolved/
operation.rs

1use super::resolver::{Resolvable, Resolver};
2use super::{ResolvedCallback, ResolvedParameter, ResolvedRequestBody, ResolvedResponse, Shared};
3use crate::ResolveError;
4use indexmap::IndexMap;
5use openapiv3::{
6    ExternalDocumentation, Operation, Responses, SecurityRequirement, Server, StatusCode,
7};
8
9/// [`Operation`] with every `$ref` replaced by the item it named.
10#[derive(Debug, PartialEq)]
11pub struct ResolvedOperation {
12    /// See [`Operation::tags`].
13    pub tags: Vec<String>,
14    /// See [`Operation::summary`].
15    pub summary: Option<String>,
16    /// See [`Operation::description`].
17    pub description: Option<String>,
18    /// See [`Operation::external_docs`].
19    pub external_docs: Option<ExternalDocumentation>,
20    /// See [`Operation::operation_id`].
21    pub operation_id: Option<String>,
22    /// See [`Operation::parameters`].
23    pub parameters: Vec<Shared<ResolvedParameter>>,
24    /// See [`Operation::request_body`].
25    pub request_body: Option<Shared<ResolvedRequestBody>>,
26    /// See [`Operation::responses`].
27    pub responses: ResolvedResponses,
28    /// See [`Operation::callbacks`].
29    pub callbacks: IndexMap<String, ResolvedCallback>,
30    /// See [`Operation::deprecated`].
31    pub deprecated: bool,
32    /// See [`Operation::security`].
33    pub security: Option<Vec<SecurityRequirement>>,
34    /// See [`Operation::servers`].
35    pub servers: Vec<Server>,
36    /// See [`Operation::extensions`].
37    pub extensions: IndexMap<String, serde_json::Value>,
38}
39
40/// [`Responses`] with every `$ref` replaced by the response it named.
41#[derive(Debug, PartialEq)]
42pub struct ResolvedResponses {
43    /// See [`Responses::default`].
44    pub default: Option<Shared<ResolvedResponse>>,
45    /// See [`Responses::responses`].
46    pub responses: IndexMap<StatusCode, Shared<ResolvedResponse>>,
47    /// See [`Responses::extensions`].
48    pub extensions: IndexMap<String, serde_json::Value>,
49}
50
51impl Resolvable for Operation {
52    type Resolved = ResolvedOperation;
53
54    fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
55        Ok(ResolvedOperation {
56            tags: self.tags.clone(),
57            summary: self.summary.clone(),
58            description: self.description.clone(),
59            external_docs: self.external_docs.clone(),
60            operation_id: self.operation_id.clone(),
61            parameters: cx.ref_or_vec(&self.parameters)?,
62            request_body: self
63                .request_body
64                .as_ref()
65                .map(|body| cx.ref_or(body))
66                .transpose()?,
67            responses: self.responses.resolve_inline(cx)?,
68            callbacks: super::resolve_map(&self.callbacks, cx)?,
69            deprecated: self.deprecated,
70            security: self.security.clone(),
71            servers: self.servers.clone(),
72            extensions: self.extensions.clone(),
73        })
74    }
75}
76
77impl Resolvable for Responses {
78    type Resolved = ResolvedResponses;
79
80    fn resolve_inline(&self, cx: &mut Resolver<'_>) -> Result<Self::Resolved, ResolveError> {
81        Ok(ResolvedResponses {
82            default: self
83                .default
84                .as_ref()
85                .map(|default| cx.ref_or(default))
86                .transpose()?,
87            responses: cx.ref_or_map(&self.responses)?,
88            extensions: self.extensions.clone(),
89        })
90    }
91}