1use 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(¶meter.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}