x402_kit/types/
schema.rs

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}