1use jacquard_common::{CowStr, IntoStatic};
2use jose_jwa::Algorithm;
3use jose_jwk::Jwk;
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
7pub struct Header<'a> {
8 #[serde(flatten)]
9 #[serde(borrow)]
10 pub registered: RegisteredHeader<'a>,
11}
12
13impl<'a> From<Header<'a>> for super::super::jose::Header<'a> {
14 fn from(header: Header<'a>) -> Self {
15 super::super::jose::Header::Jws(header)
16 }
17}
18
19#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
20
21pub struct RegisteredHeader<'a> {
22 pub alg: Algorithm,
23 #[serde(borrow)]
24 #[serde(skip_serializing_if = "Option::is_none")]
25 pub jku: Option<CowStr<'a>>,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub jwk: Option<Jwk>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub kid: Option<CowStr<'a>>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub x5u: Option<CowStr<'a>>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub x5c: Option<CowStr<'a>>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub x5t: Option<CowStr<'a>>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 #[serde(rename = "x5t#S256")]
38 pub x5ts256: Option<CowStr<'a>>,
39
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub typ: Option<CowStr<'a>>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub cty: Option<CowStr<'a>>,
44}
45
46impl From<Algorithm> for RegisteredHeader<'_> {
47 fn from(alg: Algorithm) -> Self {
48 Self {
49 alg,
50 jku: None,
51 jwk: None,
52 kid: None,
53 x5u: None,
54 x5c: None,
55 x5t: None,
56 x5ts256: None,
57 typ: None,
58 cty: None,
59 }
60 }
61}
62
63impl<'a> From<RegisteredHeader<'a>> for super::super::jose::Header<'a> {
64 fn from(registered: RegisteredHeader<'a>) -> Self {
65 super::super::jose::Header::Jws(Header { registered })
66 }
67}
68
69impl IntoStatic for RegisteredHeader<'_> {
70 type Output = RegisteredHeader<'static>;
71 fn into_static(self) -> Self::Output {
72 RegisteredHeader {
73 alg: self.alg,
74 jku: self.jku.map(IntoStatic::into_static),
75 jwk: self.jwk,
76 kid: self.kid.map(IntoStatic::into_static),
77 x5u: self.x5u.map(IntoStatic::into_static),
78 x5c: self.x5c.map(IntoStatic::into_static),
79 x5t: self.x5t.map(IntoStatic::into_static),
80 x5ts256: self.x5ts256.map(IntoStatic::into_static),
81 typ: self.typ.map(IntoStatic::into_static),
82 cty: self.cty.map(IntoStatic::into_static),
83 }
84 }
85}