Skip to main content

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    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}