1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "UPPERCASE")]
7pub enum Algorithm {
8 HS256,
10 HS384,
12 HS512,
14 RS256,
16 RS384,
18 RS512,
20 ES256,
22 ES384,
24 ES512,
26 EdDSA,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct Header {
33 pub alg: Algorithm,
35 #[serde(default)]
37 pub typ: Option<String>,
38 #[serde(default)]
40 pub kid: Option<String>,
41 #[serde(flatten)]
43 pub extra: serde_json::Map<String, Value>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct Claims(pub serde_json::Map<String, Value>);
49
50impl Claims {
51 pub fn get(&self, k: &str) -> Option<&Value> { self.0.get(k) }
53 pub fn map(&self) -> &serde_json::Map<String, Value> { &self.0 }
55 pub fn map_mut(&mut self) -> &mut serde_json::Map<String, Value> { &mut self.0 }
57}
58
59#[derive(Debug, Clone)]
61pub struct Jwt {
62 pub header: Header,
64 pub claims: Claims,
66 pub signature_b64: String,
68 pub raw_header_b64: String,
70 pub raw_payload_b64: String,
72}
73
74#[cfg(feature = "explain")]
75#[derive(Debug, Clone)]
77pub struct Explanation {
78 pub steps: Vec<String>,
80}