use crate::error::{TychoResult, TychoError};
use crate::Element;
pub trait CompressElement {
fn compress(self) -> Self;
}
pub trait DecompressElement: Sized {
#[doc(hidden)]
fn _impl_decompress(self) -> Result<Self, (Self, TychoError)>;
fn decompress(self) -> TychoResult<Self> {
match self._impl_decompress() {
Ok(x) => Ok(x),
Err(e) => Err(e.1)
}
}
fn decompress_lossy(self) -> Self {
match self._impl_decompress() {
Ok(x) => x,
Err(e) => e.0
}
}
fn decompress_opt(self) -> Option<Self> {
match self._impl_decompress() {
Ok(x) => Some(x),
Err(_e) => None
}
}
}
impl CompressElement for Element {
fn compress(self) -> Self {
Element::Compression(Box::new(self))
}
}
impl DecompressElement for Element {
fn _impl_decompress(self) -> Result<Self, (Self, TychoError)> {
if let Element::Compression(e) = self {
Ok(*e)
} else {
Err((self, TychoError::Other("Element cannot be decompressed".to_string())))
}
}
}