use crate::generated::quilkin::filters::concatenate::v1alpha1 as proto;
mod config;
use crate::filters::prelude::*;
pub use config::{Config, Strategy};
pub struct Concatenate {
on_read: Strategy,
on_write: Strategy,
bytes: Vec<u8>,
}
impl Concatenate {
pub fn new(config: Config) -> Self {
Self {
on_read: config.on_read,
on_write: config.on_write,
bytes: config.bytes,
}
}
pub fn testing(config: Config) -> Self {
Self::new(config)
}
}
impl Filter for Concatenate {
fn read<P: PacketMut>(&self, ctx: &mut ReadContext<'_, P>) -> Result<(), FilterError> {
match self.on_read {
Strategy::Append => {
ctx.contents.extend_tail(&self.bytes);
}
Strategy::Prepend => {
ctx.contents.extend_head(&self.bytes);
}
Strategy::DoNothing => {}
}
Ok(())
}
fn write<P: PacketMut>(&self, ctx: &mut WriteContext<P>) -> Result<(), FilterError> {
match self.on_write {
Strategy::Append => {
ctx.contents.extend_tail(&self.bytes);
}
Strategy::Prepend => {
ctx.contents.extend_head(&self.bytes);
}
Strategy::DoNothing => {}
}
Ok(())
}
}
impl StaticFilter for Concatenate {
const NAME: &'static str = "quilkin.filters.concatenate.v1alpha1.Concatenate";
type Configuration = Config;
type BinaryConfiguration = proto::Concatenate;
fn try_from_config(config: Option<Self::Configuration>) -> Result<Self, CreationError> {
Ok(Concatenate::new(Self::ensure_config_exists(config)?))
}
}