use crate::algorithm::AlgorithmType;
use crate::error::{Error, Result};
use crate::limits::MAX_ALG_LENGTH;
use crate::utils::bounds::validate_field_size;
use miniserde::Deserialize;
#[derive(Debug, Clone)]
pub(crate) struct TokenHeader {
pub algorithm: AlgorithmType,
pub key_id: Option<String>,
}
impl TokenHeader {
pub(crate) fn from_json_str(json: &str) -> Result<Self> {
#[derive(Deserialize)]
struct TokenHeaderIntermediate {
#[serde(rename = "alg")]
algorithm: String,
#[serde(rename = "kid")]
key_id: Option<String>,
}
let intermediate: TokenHeaderIntermediate = miniserde::json::from_str(json)
.map_err(|e| Error::FormatInvalidJson(format!("Failed to parse header: {e}")))?;
validate_field_size("alg", &intermediate.algorithm, MAX_ALG_LENGTH)?;
let algorithm = AlgorithmType::from_str(&intermediate.algorithm)?;
Ok(Self {
algorithm,
key_id: intermediate.key_id,
})
}
}