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}