restify_openapi/models/
components.rs

1use crate::models::paths::{Callback, Example, Header, Link, Parameter, RequestBody, Response};
2use crate::models::reference_or::ReferenceOr;
3use crate::models::security::SecurityScheme;
4use indexmap::IndexMap;
5use schemars::schema::Schema;
6use serde::Serialize;
7use serde_json::Value;
8use std::collections::BTreeMap;
9
10/// Holds a set of reusable objects for different aspects of the OAS. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object.
11#[derive(Serialize, Clone, Debug, Default)]
12#[cfg_attr(
13  any(test, feature = "deserialize"),
14  derive(serde::Deserialize, PartialEq)
15)]
16#[serde(rename_all = "camelCase")]
17pub struct Components {
18  /// An object to hold reusable [Schema Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#schema-object).
19  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
20  pub schemas: BTreeMap<String, ReferenceOr<Schema>>,
21  /// An object to hold reusable [Response Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#response-object).
22  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
23  pub responses: BTreeMap<String, ReferenceOr<Response>>,
24  /// An object to hold reusable [Parameter Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#parameter-object).
25  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
26  pub parameters: BTreeMap<String, ReferenceOr<Parameter>>,
27  /// An object to hold reusable [Example Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#example-object).
28  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
29  pub examples: BTreeMap<String, ReferenceOr<Example>>,
30  /// An object to hold reusable [Request Body Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#request-body-object).
31  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
32  pub request_bodies: BTreeMap<String, ReferenceOr<RequestBody>>,
33  /// An object to hold reusable [Header Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#header-object).
34  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
35  pub headers: BTreeMap<String, ReferenceOr<Header>>,
36  /// An object to hold reusable [Security Scheme Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#security-scheme-object).
37  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
38  pub security_schemes: BTreeMap<String, ReferenceOr<SecurityScheme>>,
39  /// An object to hold reusable [Link Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#link-object).
40  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
41  pub links: BTreeMap<String, ReferenceOr<Link>>,
42  /// An object to hold reusable [Callback Objects](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#callback-object).
43  #[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
44  pub callbacks: BTreeMap<String, ReferenceOr<Callback>>,
45  /// This object MAY be extended with [Specification Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specification-extensions).
46  #[serde(
47    flatten,
48    skip_serializing_if = "IndexMap::is_empty",
49    skip_deserializing
50  )]
51  pub extensions: IndexMap<String, Value>,
52}
53
54impl Components {
55  pub fn merge(&mut self, other: Components) {
56    self.schemas.extend(other.schemas);
57    self.responses.extend(other.responses);
58    self.parameters.extend(other.parameters);
59    self.examples.extend(other.examples);
60    self.request_bodies.extend(other.request_bodies);
61    self.headers.extend(other.headers);
62    self.security_schemes.extend(other.security_schemes);
63    self.links.extend(other.links);
64    self.callbacks.extend(other.callbacks);
65    self.extensions.extend(other.extensions);
66  }
67}