use anyhow::bail;
use bc_components::{Compressed, DigestProvider};
use dcbor::prelude::*;
use crate::{Envelope, EnvelopeError, base::envelope::EnvelopeCase};
impl Envelope {
pub fn compress(&self) -> Result<Self, EnvelopeError> {
match self.case() {
EnvelopeCase::Compressed(_) => Ok(self.clone()),
#[cfg(feature = "encrypt")]
EnvelopeCase::Encrypted(_) => Err(EnvelopeError::AlreadyEncrypted),
EnvelopeCase::Elided(_) => Err(EnvelopeError::AlreadyElided),
_ => {
let compressed = Compressed::from_uncompressed_data(self.tagged_cbor().cbor_data(), Some(self.digest().into_owned()));
Ok(Envelope::new(compressed))
},
}
}
pub fn uncompress(&self) -> anyhow::Result<Self> {
if let EnvelopeCase::Compressed(compressed) = self.case() {
if let Some(digest) = compressed.digest_ref_opt() {
if digest != self.digest().as_ref() {
bail!(EnvelopeError::InvalidDigest);
}
let a = compressed.uncompress()?;
let envelope = Envelope::from_tagged_cbor_data(&a)?;
if envelope.digest().as_ref() != digest {
bail!(EnvelopeError::InvalidDigest);
}
Ok(envelope)
} else {
bail!(EnvelopeError::MissingDigest)
}
} else {
bail!(EnvelopeError::NotCompressed)
}
}
pub fn compress_subject(&self) -> Result<Self, EnvelopeError> {
if self.subject().is_compressed() {
Ok(self.clone())
} else {
let subject = self.subject().compress()?;
Ok(self.replace_subject(subject))
}
}
pub fn uncompress_subject(&self) -> anyhow::Result<Self> {
if self.subject().is_compressed() {
let subject = self.subject().uncompress()?;
Ok(self.replace_subject(subject))
} else {
Ok(self.clone())
}
}
}