torn_api_codegen/openapi/
path.rs1use 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}