torn_api_codegen/openapi/
path.rs1use std::borrow::Cow;
2
3use serde::{Deserialize, Deserializer};
4
5use super::parameter::OpenApiParameter;
6
7#[derive(Debug, Clone, Deserialize)]
8#[serde(untagged)]
9pub enum OpenApiPathParameter<'a> {
10 Link {
11 #[serde(rename = "$ref")]
12 ref_path: &'a str,
13 },
14 Inline(OpenApiParameter<'a>),
15}
16
17#[derive(Debug, Clone, Deserialize)]
18pub struct SchemaLink<'a> {
19 #[serde(rename = "$ref")]
20 pub ref_path: &'a str,
21}
22
23#[derive(Debug, Clone, Deserialize)]
24#[serde(untagged)]
25pub enum OpenApiResponseBody<'a> {
26 Schema(SchemaLink<'a>),
27 Union {
28 #[serde(borrow, rename = "anyOf")]
29 any_of: Vec<SchemaLink<'a>>,
30 },
31}
32
33fn deserialize_response_body<'de, D>(deserializer: D) -> Result<OpenApiResponseBody<'de>, D::Error>
34where
35 D: Deserializer<'de>,
36{
37 #[derive(Deserialize)]
38 struct Json<'a> {
39 #[serde(borrow)]
40 schema: OpenApiResponseBody<'a>,
41 }
42 #[derive(Deserialize)]
43 struct Content<'a> {
44 #[serde(borrow, rename = "application/json")]
45 json: Json<'a>,
46 }
47 #[derive(Deserialize)]
48 struct StatusOk<'a> {
49 #[serde(borrow)]
50 content: Content<'a>,
51 }
52 #[derive(Deserialize)]
53 struct Responses<'a> {
54 #[serde(borrow, rename = "200")]
55 ok: StatusOk<'a>,
56 }
57
58 let responses = Responses::deserialize(deserializer)?;
59
60 Ok(responses.ok.content.json.schema)
61}
62
63#[derive(Debug, Clone, Deserialize)]
64pub struct OpenApiPathBody<'a> {
65 pub summary: Option<Cow<'a, str>>,
66 pub description: Option<Cow<'a, str>>,
67 #[serde(borrow, default)]
68 pub parameters: Vec<OpenApiPathParameter<'a>>,
69 #[serde(
70 borrow,
71 rename = "responses",
72 deserialize_with = "deserialize_response_body"
73 )]
74 pub response_content: OpenApiResponseBody<'a>,
75}
76
77#[derive(Debug, Clone, Deserialize)]
78pub struct OpenApiPath<'a> {
79 #[serde(borrow)]
80 pub get: OpenApiPathBody<'a>,
81}