use crate::{b64, types::{Header, Claims, Jwt}, Error, Result};
pub fn decode(token: &str) -> Result<Jwt> {
let parts: Vec<&str> = token.split('.').collect();
if parts.len() != 3 { return Err(Error::Malformed); }
let header: Header = serde_json::from_slice(&b64::decode_url(parts[0])?)
.map_err(|e| Error::Json(e.to_string()))?;
let claims_map: serde_json::Map<String, serde_json::Value> =
serde_json::from_slice(&b64::decode_url(parts[1])?).map_err(|e| Error::Json(e.to_string()))?;
Ok(Jwt {
header,
claims: Claims(claims_map),
signature_b64: parts[2].to_string(),
raw_header_b64: parts[0].to_string(),
raw_payload_b64: parts[1].to_string(),
})
}
impl crate::types::Jwt {
pub fn decode(token: &str) -> Result<Self> { decode(token) }
}