use crate::{DecodedDisclosure, DecodedSdJwt, Disclosure, PartsRef};
#[derive(thiserror::Error, Debug)]
pub enum DecodeError {
#[error("Unable to decode undisclosed JWT: {0}")]
UndisclosedJWT(#[from] ssi_jws::DecodeError),
#[error("Unable to deserialize string format of concatenated tildes")]
UnableToDeserializeStringFormat,
#[error("JWT payload claims were not a JSON object")]
ClaimsWrongType,
#[error("JWT is missing _sd_alg property")]
MissingSdAlg,
#[error("Unknown value of _sd_alg {0}")]
UnknownSdAlg(String),
#[error("Type of _sd_alg was not string")]
SdAlgWrongType,
#[error("Multiple disclosures given with the same hash")]
MultipleDisclosuresWithSameHash,
#[error("An _sd claim wasn't a string")]
SdClaimNotString,
#[error("An _sd property was not an array type")]
SdPropertyNotArray,
#[error("A disclosure claim would collid with an existing JWT claim")]
DisclosureClaimCollidesWithJwtClaim,
#[error("A disclosure is malformed")]
DisclosureMalformed,
#[error("A single disclosure was used multiple times")]
DisclosureUsedMultipleTimes,
#[error("Found an array item disclosure when expecting a property type")]
ArrayDisclosureWhenExpectingProperty,
#[error("Found a property type disclosure when expecting an array item")]
PropertyDisclosureWhenExpectingArray,
#[error("A disclosure was not used during decoding")]
UnusedDisclosure,
#[error(transparent)]
JWS(#[from] ssi_jws::Error),
#[error(transparent)]
JsonDeserialization(#[from] serde_json::Error),
}
impl<'a> PartsRef<'a> {
pub fn decode(self) -> Result<DecodedSdJwt<'a>, DecodeError> {
Ok(DecodedSdJwt {
jwt: self
.jwt
.decode()?
.try_map(|bytes| serde_json::from_slice(&bytes))?,
disclosures: self
.disclosures
.into_iter()
.map(Disclosure::decode)
.collect::<Result<_, _>>()?,
})
}
}
impl Disclosure {
pub fn decode(&self) -> Result<DecodedDisclosure, DecodeError> {
DecodedDisclosure::new(self)
}
}