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 Csv,
27 Schema(SchemaLink<'a>),
28 Union {
29 #[serde(borrow, rename = "anyOf")]
30 any_of: Vec<SchemaLink<'a>>,
31 },
32}
33
34#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
35pub struct OperationId(pub String);
36
37fn deserialize_response_body<'de, D>(deserializer: D) -> Result<OpenApiResponseBody<'de>, D::Error>
38where
39 D: Deserializer<'de>,
40{
41 #[derive(Deserialize)]
42 struct Json<'a> {
43 #[serde(borrow)]
44 schema: OpenApiResponseBody<'a>,
45 }
46 #[derive(Deserialize)]
47 enum Content<'a> {
48 #[serde(borrow, rename = "application/json")]
49 Json(Json<'a>),
50 #[serde(rename = "text/csv")]
51 Csv(serde::de::IgnoredAny),
52 }
53 #[derive(Deserialize)]
54 struct StatusOk<'a> {
55 #[serde(borrow)]
56 content: Content<'a>,
57 }
58 #[derive(Deserialize)]
59 struct Responses<'a> {
60 #[serde(borrow, rename = "200")]
61 ok: StatusOk<'a>,
62 }
63
64 let responses = Responses::deserialize(deserializer)?;
65
66 match responses.ok.content {
67 Content::Json(json) => Ok(json.schema),
68 Content::Csv(_) => Ok(OpenApiResponseBody::Csv),
69 }
70}
71
72#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
73#[serde(rename_all = "snake_case")]
74pub struct OpenApiPathBody<'a> {
75 pub summary: Option<Cow<'a, str>>,
76 pub description: Option<Cow<'a, str>>,
77 #[serde(borrow, default)]
78 pub parameters: Vec<OpenApiPathParameter<'a>>,
79 #[serde(
80 borrow,
81 rename = "responses",
82 deserialize_with = "deserialize_response_body"
83 )]
84 pub response_content: OpenApiResponseBody<'a>,
85 pub operation_id: Option<OperationId>,
86}
87
88#[derive(Debug, Clone, Deserialize, PartialEq, Eq)]
89pub struct OpenApiPath<'a> {
90 #[serde(borrow)]
91 pub get: OpenApiPathBody<'a>,
92}