Skip to main content

oag_core/parse/
spec.rs

1use indexmap::IndexMap;
2use serde::{Deserialize, Serialize};
3
4use super::components::Components;
5use super::operation::PathItem;
6use super::security::SecurityRequirement;
7use super::server::Server;
8
9/// Info object describing the API.
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct Info {
12    pub title: String,
13
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub description: Option<String>,
16
17    pub version: String,
18
19    #[serde(rename = "termsOfService", skip_serializing_if = "Option::is_none")]
20    pub terms_of_service: Option<String>,
21
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub contact: Option<Contact>,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub license: Option<License>,
27}
28
29/// Contact information.
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31pub struct Contact {
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub name: Option<String>,
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub url: Option<String>,
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub email: Option<String>,
38}
39
40/// License information.
41#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
42pub struct License {
43    pub name: String,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub url: Option<String>,
46}
47
48/// Tag definition.
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
50pub struct Tag {
51    pub name: String,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub description: Option<String>,
54}
55
56/// Top-level OpenAPI 3.x specification.
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
58pub struct OpenApiSpec {
59    pub openapi: String,
60
61    pub info: Info,
62
63    #[serde(default, skip_serializing_if = "Vec::is_empty")]
64    pub servers: Vec<Server>,
65
66    #[serde(default, skip_serializing_if = "IndexMap::is_empty")]
67    pub paths: IndexMap<String, PathItem>,
68
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub components: Option<Components>,
71
72    #[serde(default, skip_serializing_if = "Vec::is_empty")]
73    pub tags: Vec<Tag>,
74
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub security: Option<Vec<SecurityRequirement>>,
77}