use crate::{Transformer, TransformerError, TransformerExt};
use alloc::boxed::Box;
use alloc::vec::Vec;
#[derive(Default)]
pub struct TransformerPipeline {
transformers: Vec<Box<dyn Transformer>>,
}
impl TransformerPipeline {
#[must_use]
pub fn new() -> TransformerPipeline {
Self {
transformers: Vec::new(),
}
}
pub fn add<T>(&mut self, transformer: T)
where
T: Transformer + 'static,
{
self.transformers.push(Box::new(transformer));
}
pub fn apply(&mut self, data: impl AsRef<[u8]>) -> Result<Vec<u8>, TransformerError> {
let mut buf = data.as_ref().to_vec();
for transformer in &mut self.transformers {
buf = transformer.apply(&buf)?;
}
Ok(buf)
}
pub fn reverse(&mut self, data: impl AsRef<[u8]>) -> Result<Vec<u8>, TransformerError> {
let mut buf = data.as_ref().to_vec();
for transformer in self.transformers.iter_mut().rev() {
buf = transformer.reverse_bytes(&buf)?;
}
Ok(buf)
}
}
impl Clone for TransformerPipeline {
fn clone(&self) -> Self {
let transformers = self.transformers.iter().map(|p| p.box_clone()).collect();
Self { transformers }
}
}