torn_api_codegen/openapi/
path.rs

1use std::borrow::Cow;
2
3use serde::{Deserialize, Deserializer, Serialize};
4
5use super::parameter::OpenApiParameter;
6
7#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
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, PartialEq, Eq)]
18pub struct SchemaLink<'a> {
19    #[serde(rename = "$ref")]
20    pub ref_path: &'a str,
21}
22
23#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
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
33#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
34pub struct OperationId(pub String);
35
36fn deserialize_response_body<'de, D>(deserializer: D) -> Result<OpenApiResponseBody<'de>, D::Error>
37where
38    D: Deserializer<'de>,
39{
40    #[derive(Deserialize)]
41    struct Json<'a> {
42        #[serde(borrow)]
43        schema: OpenApiResponseBody<'a>,
44    }
45    #[derive(Deserialize)]
46    struct Content<'a> {
47        #[serde(borrow, rename = "application/json")]
48        json: Json<'a>,
49    }
50    #[derive(Deserialize)]
51    struct StatusOk<'a> {
52        #[serde(borrow)]
53        content: Content<'a>,
54    }
55    #[derive(Deserialize)]
56    struct Responses<'a> {
57        #[serde(borrow, rename = "200")]
58        ok: StatusOk<'a>,
59    }
60
61    let responses = Responses::deserialize(deserializer)?;
62
63    Ok(responses.ok.content.json.schema)
64}
65
66#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
67#[serde(rename_all = "snake_case")]
68pub struct OpenApiPathBody<'a> {
69    pub summary: Option<Cow<'a, str>>,
70    pub description: Option<Cow<'a, str>>,
71    #[serde(borrow, default)]
72    pub parameters: Vec<OpenApiPathParameter<'a>>,
73    #[serde(
74        borrow,
75        rename = "responses",
76        deserialize_with = "deserialize_response_body"
77    )]
78    pub response_content: OpenApiResponseBody<'a>,
79    pub operation_id: Option<OperationId>,
80}
81
82#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
83pub struct OpenApiPath<'a> {
84    #[serde(borrow)]
85    pub get: OpenApiPathBody<'a>,
86}