torn_api_codegen/openapi/
path.rs

1use 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: 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}