openapiv3_resolve/resolved/
operation.rs1use 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#[derive(Debug, PartialEq)]
11pub struct ResolvedOperation {
12 pub tags: Vec<String>,
14 pub summary: Option<String>,
16 pub description: Option<String>,
18 pub external_docs: Option<ExternalDocumentation>,
20 pub operation_id: Option<String>,
22 pub parameters: Vec<Shared<ResolvedParameter>>,
24 pub request_body: Option<Shared<ResolvedRequestBody>>,
26 pub responses: ResolvedResponses,
28 pub callbacks: IndexMap<String, ResolvedCallback>,
30 pub deprecated: bool,
32 pub security: Option<Vec<SecurityRequirement>>,
34 pub servers: Vec<Server>,
36 pub extensions: IndexMap<String, serde_json::Value>,
38}
39
40#[derive(Debug, PartialEq)]
42pub struct ResolvedResponses {
43 pub default: Option<Shared<ResolvedResponse>>,
45 pub responses: IndexMap<StatusCode, Shared<ResolvedResponse>>,
47 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}