json_web_token/
payload.rs1use serde::{ser::SerializeStruct, Serialize, Serializer};
2
3#[derive(Debug, Clone)]
4pub enum Value {
5 String(String),
6 Boolean(bool),
7 I8(i8),
8 I16(i16),
9 I32(i32),
10 I64(i64),
11 U8(u8),
12 U16(u16),
13 U32(u32),
14 U64(u64),
15 F32(f32),
16 F64(f64),
17}
18
19impl Serialize for Value {
20 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
21 where
22 S: Serializer,
23 {
24 match self {
25 Value::String(value) => serializer.serialize_str(value),
26 Value::Boolean(value) => serializer.serialize_bool(*value),
27 Value::I8(value) => serializer.serialize_i8(*value),
28 Value::I16(value) => serializer.serialize_i16(*value),
29 Value::I32(value) => serializer.serialize_i32(*value),
30 Value::I64(value) => serializer.serialize_i64(*value),
31 Value::U8(value) => serializer.serialize_u8(*value),
32 Value::U16(value) => serializer.serialize_u16(*value),
33 Value::U32(value) => serializer.serialize_u32(*value),
34 Value::U64(value) => serializer.serialize_u64(*value),
35 Value::F32(value) => serializer.serialize_f32(*value),
36 Value::F64(value) => serializer.serialize_f64(*value),
37 }
38 }
39}
40
41impl From<String> for Value {
42 #[inline(always)]
43 fn from(value: String) -> Self {
44 Value::String(value)
45 }
46}
47
48impl From<bool> for Value {
49 #[inline(always)]
50 fn from(value: bool) -> Self {
51 Value::Boolean(value)
52 }
53}
54
55impl From<i8> for Value {
56 #[inline(always)]
57 fn from(value: i8) -> Self {
58 Value::I8(value)
59 }
60}
61
62impl From<i16> for Value {
63 #[inline(always)]
64 fn from(value: i16) -> Self {
65 Value::I16(value)
66 }
67}
68
69impl From<i32> for Value {
70 #[inline(always)]
71 fn from(value: i32) -> Self {
72 Value::I32(value)
73 }
74}
75
76impl From<i64> for Value {
77 #[inline(always)]
78 fn from(value: i64) -> Self {
79 Value::I64(value)
80 }
81}
82
83impl From<u8> for Value {
84 #[inline(always)]
85 fn from(value: u8) -> Self {
86 Value::U8(value)
87 }
88}
89
90impl From<u16> for Value {
91 #[inline(always)]
92 fn from(value: u16) -> Self {
93 Value::U16(value)
94 }
95}
96
97impl From<u32> for Value {
98 #[inline(always)]
99 fn from(value: u32) -> Self {
100 Value::U32(value)
101 }
102}
103
104impl From<u64> for Value {
105 #[inline(always)]
106 fn from(value: u64) -> Self {
107 Value::U64(value)
108 }
109}
110
111impl From<f32> for Value {
112 #[inline(always)]
113 fn from(value: f32) -> Self {
114 Value::F32(value)
115 }
116}
117
118impl From<f64> for Value {
119 #[inline(always)]
120 fn from(value: f64) -> Self {
121 Value::F64(value)
122 }
123}
124
125#[derive(Debug, Clone, Default)]
126pub struct Payload {
127 pub issuer: Option<Value>,
128 pub subject: Option<Value>,
129 pub audience: Option<Value>,
130 pub expiration_time: Option<Value>,
131}
132
133impl Payload {
134 #[inline]
135 pub fn new() -> Self {
136 Self {
137 issuer: None,
138 subject: None,
139 audience: None,
140 expiration_time: None,
141 }
142 }
143}
144
145impl Serialize for Payload {
146 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
147 where
148 S: Serializer,
149 {
150 let mut s = serializer.serialize_struct("JWTClaims", 1)?;
151 if let Some(issuer) = &self.issuer {
152 s.serialize_field("iss", issuer)?;
153 }
154 if let Some(subject) = &self.subject {
155 s.serialize_field("sub", subject)?;
156 }
157 if let Some(audience) = &self.audience {
158 s.serialize_field("aud", audience)?;
159 }
160 if let Some(expiration_time) = &self.expiration_time {
161 s.serialize_field("exp", expiration_time)?;
162 }
163 s.end()
164 }
165}