x402_kit/types/
common.rs

1use std::fmt::{Debug, Display};
2
3use serde::{Deserialize, Serialize};
4
5pub type Record<V> = std::collections::HashMap<String, V>;
6
7pub type AnyJson = serde_json::Value;
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10pub struct X402V1;
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13pub struct X402V2;
14
15impl Serialize for X402V1 {
16    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17    where
18        S: serde::Serializer,
19    {
20        serializer.serialize_i8(1)
21    }
22}
23
24impl<'de> Deserialize<'de> for X402V1 {
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: serde::Deserializer<'de>,
28    {
29        let v = i8::deserialize(deserializer)?;
30        match v {
31            1 => Ok(X402V1),
32            _ => Err(serde::de::Error::custom(format!(
33                "Unsupported X402 version {}; expected 1",
34                v
35            ))),
36        }
37    }
38}
39
40impl Display for X402V1 {
41    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42        write!(f, "1")
43    }
44}
45
46impl Serialize for X402V2 {
47    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
48    where
49        S: serde::Serializer,
50    {
51        serializer.serialize_i8(2)
52    }
53}
54
55impl<'de> Deserialize<'de> for X402V2 {
56    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
57    where
58        D: serde::Deserializer<'de>,
59    {
60        let v = i8::deserialize(deserializer)?;
61        match v {
62            2 => Ok(X402V2),
63            _ => Err(serde::de::Error::custom(format!(
64                "Unsupported X402 version {}; expected 2",
65                v
66            ))),
67        }
68    }
69}
70
71impl Display for X402V2 {
72    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73        write!(f, "2")
74    }
75}
76
77#[derive(Debug, Clone, PartialEq, Eq)]
78pub struct Base64EncodedHeader(pub String);
79
80impl Serialize for Base64EncodedHeader {
81    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
82    where
83        S: serde::Serializer,
84    {
85        serializer.serialize_str(&self.0)
86    }
87}
88
89impl<'de> Deserialize<'de> for Base64EncodedHeader {
90    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
91    where
92        D: serde::Deserializer<'de>,
93    {
94        let s = String::deserialize(deserializer)?;
95        Ok(Base64EncodedHeader(s))
96    }
97}
98
99impl Display for Base64EncodedHeader {
100    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
101        write!(f, "{}", self.0)
102    }
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct Extension {
107    pub info: AnyJson,
108    pub schema: AnyJson,
109}