Skip to main content

poolster_core/
openapi32.rs

1//! Typed transport metadata for OpenAPI content, sequential data and multipart.
2use crate::{Operation, OperationParameter, SchemaValue};
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::BTreeMap;
6
7#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
8pub struct ContentDefinition {
9    #[serde(default)]
10    pub content_type: String,
11    #[serde(default, skip_serializing_if = "Option::is_none")]
12    pub schema_definition: Option<Value>,
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub item_schema_definition: Option<Value>,
15    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
16    pub encoding: BTreeMap<String, Encoding>,
17    #[serde(default, skip_serializing_if = "Vec::is_empty")]
18    pub prefix_encoding: Vec<Encoding>,
19    #[serde(default, skip_serializing_if = "Option::is_none")]
20    pub item_encoding: Option<Encoding>,
21}
22impl ContentDefinition {
23    pub fn schema(&self) -> Option<SchemaValue> {
24        self.schema_definition
25            .as_ref()
26            .map(crate::adapter::openapi_sidecar::convert_value)
27    }
28    pub fn item_schema(&self) -> Option<SchemaValue> {
29        self.item_schema_definition
30            .as_ref()
31            .map(crate::adapter::openapi_sidecar::convert_value)
32    }
33}
34#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
35pub struct Encoding {
36    #[serde(
37        default,
38        rename = "contentType",
39        skip_serializing_if = "Option::is_none"
40    )]
41    pub content_type: Option<String>,
42    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
43    pub headers: BTreeMap<String, PartHeader>,
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub style: Option<String>,
46    #[serde(default, skip_serializing_if = "Option::is_none")]
47    pub explode: Option<bool>,
48    #[serde(default, rename = "allowReserved")]
49    pub allow_reserved: bool,
50    #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
51    pub encoding: BTreeMap<String, Encoding>,
52    #[serde(
53        default,
54        rename = "prefixEncoding",
55        skip_serializing_if = "Vec::is_empty"
56    )]
57    pub prefix_encoding: Vec<Encoding>,
58    #[serde(
59        default,
60        rename = "itemEncoding",
61        skip_serializing_if = "Option::is_none"
62    )]
63    pub item_encoding: Option<Box<Encoding>>,
64}
65#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
66pub struct PartHeader {
67    #[serde(default)]
68    pub required: bool,
69    #[serde(default)]
70    pub style: Option<String>,
71    #[serde(default)]
72    pub explode: Option<bool>,
73    #[serde(default, rename = "allowReserved")]
74    pub allow_reserved: bool,
75    #[serde(default)]
76    pub schema_definition: Option<Value>,
77    #[serde(default)]
78    pub example_json: Option<String>,
79}
80#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
81pub struct ResponseContentDefinition {
82    pub status: String,
83    #[serde(flatten)]
84    pub content: ContentDefinition,
85}
86
87fn read<T: for<'de> Deserialize<'de>>(
88    annotations: &BTreeMap<String, Value>,
89    key: &str,
90) -> serde_json::Result<Vec<T>> {
91    annotations
92        .get(key)
93        .map(|value| serde_json::from_value(value.clone()))
94        .unwrap_or_else(|| Ok(Vec::new()))
95}
96pub fn request_content(operation: &Operation) -> serde_json::Result<Vec<ContentDefinition>> {
97    read(&operation.annotations, "poolster.request_content")
98}
99pub fn response_content(
100    operation: &Operation,
101) -> serde_json::Result<Vec<ResponseContentDefinition>> {
102    read(&operation.annotations, "poolster.response_content")
103}
104pub fn parameter_content(
105    parameter: &OperationParameter,
106) -> serde_json::Result<Vec<ContentDefinition>> {
107    read(&parameter.annotations, "poolster.parameter_content")
108}
109
110#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
111pub struct ApiMetadata {
112    #[serde(default)]
113    #[serde(rename = "self")]
114    pub self_uri: Option<String>,
115    #[serde(default)]
116    pub tags: Vec<TagMetadata>,
117}
118#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
119pub struct TagMetadata {
120    pub name: String,
121    #[serde(default)]
122    pub summary: Option<String>,
123    #[serde(default)]
124    pub description: Option<String>,
125    #[serde(default)]
126    pub parent: Option<String>,
127    #[serde(default)]
128    pub kind: Option<String>,
129}