1use bon::Builder;
2use serde::{Deserialize, Serialize};
3
4use crate::types::Record;
5
6#[derive(Builder, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct FieldDefinition {
9 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
10 pub field_type: Option<String>,
11
12 #[serde(skip_serializing_if = "Option::is_none")]
13 pub required: Option<FieldRequired>,
14
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub description: Option<String>,
17
18 #[serde(rename = "enum", skip_serializing_if = "Option::is_none")]
19 pub field_enum: Option<Vec<String>>,
20
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub properties: Option<Record<FieldDefinition>>,
23}
24
25impl TryFrom<serde_json::Value> for FieldDefinition {
26 type Error = serde_json::Error;
27
28 fn try_from(value: serde_json::Value) -> Result<Self, Self::Error> {
29 serde_json::from_value(value)
30 }
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(untagged)]
35pub enum FieldRequired {
36 Boolean(bool),
37 VecString(Vec<String>),
38}
39
40#[derive(Builder, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct Input {
43 #[serde(rename = "type")]
44 pub input_type: InputType,
45
46 pub method: InputMethod,
47
48 #[serde(skip_serializing_if = "Option::is_none")]
49 pub body_type: Option<InputBodyType>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
52 pub query_params: Option<Record<FieldDefinition>>,
53
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub body_fields: Option<Record<FieldDefinition>>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub header_fields: Option<Record<FieldDefinition>>,
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
62pub enum InputType {
63 #[serde(rename = "http")]
64 Http,
65}
66
67#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
68pub enum InputMethod {
69 #[serde(rename = "get")]
70 Get,
71 #[serde(rename = "post")]
72 Post,
73}
74
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
76pub enum InputBodyType {
77 #[serde(rename = "json")]
78 Json,
79 #[serde(rename = "form-data")]
80 FormData,
81 #[serde(rename = "multipart-form-data")]
82 MultipartFormData,
83 #[serde(rename = "text")]
84 Text,
85 #[serde(rename = "binary")]
86 Binary,
87 #[serde(rename = "event-stream")]
88 EventStream,
89}
90
91#[derive(Builder, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase")]
93pub struct OutputSchema {
94 pub input: Input,
95
96 #[serde(skip_serializing_if = "Option::is_none")]
97 pub output: Option<Record<FieldDefinition>>,
98}