json_web_token/
payload.rs

1use 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}