use crate::compact::JweProtectedHeader;
use serde::{Deserialize, Serialize};
pub struct JweBuilder {
pub(crate) header: JweProtectedHeader,
pub(crate) payload: Vec<u8>,
}
impl From<Vec<u8>> for JweBuilder {
fn from(payload: Vec<u8>) -> Self {
JweBuilder {
header: JweProtectedHeader::default(),
payload,
}
}
}
impl JweBuilder {
pub fn into_json<T: Serialize>(value: &T) -> Result<Self, serde_json::Error> {
serde_json::to_vec(value).map(|payload| JweBuilder {
header: JweProtectedHeader::default(),
payload,
})
}
pub fn set_typ(mut self, typ: Option<&str>) -> Self {
self.header.typ = typ.map(|s| s.to_string());
self
}
pub fn set_cty(mut self, cty: Option<&str>) -> Self {
self.header.cty = cty.map(|s| s.to_string());
self
}
pub fn set_client_id(mut self, client_id: Option<&str>) -> Self {
self.header.client_id = client_id.map(|s| s.to_string());
self
}
pub fn build(self) -> Jwe {
let JweBuilder { header, payload } = self;
Jwe { header, payload }
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Jwe {
pub(crate) header: JweProtectedHeader,
pub(crate) payload: Vec<u8>,
}
impl Jwe {
pub fn payload(&self) -> &[u8] {
&self.payload
}
pub fn header(&self) -> &JweProtectedHeader {
&self.header
}
pub fn into_json<T: Serialize>(value: &T) -> Result<Jwe, serde_json::Error> {
serde_json::to_vec(value).map(|payload| Jwe {
header: JweProtectedHeader::default(),
payload,
})
}
pub fn from_json<'a, T: Deserialize<'a>>(&'a self) -> Result<T, serde_json::Error> {
serde_json::from_slice(self.payload())
}
}