use crate::net::endpoint::metadata::Value;
use bytes::Bytes;
#[inline]
fn is_valid_size(contents: &[u8], size: u32) -> bool {
contents.len() >= size as usize
}
#[derive(Debug, Eq, PartialEq, serde::Deserialize, schemars::JsonSchema, serde::Serialize)]
pub struct Prefix {
#[serde(default)]
pub remove: bool,
pub size: u32,
}
impl super::CaptureStrategy for Prefix {
fn capture(&self, contents: &[u8]) -> Option<(Value, isize)> {
is_valid_size(contents, self.size).then(|| {
let value = Value::Bytes(Bytes::copy_from_slice(&contents[..self.size as _]));
(
value,
if self.remove {
-(self.size as isize)
} else {
0
},
)
})
}
}
#[derive(Debug, Eq, PartialEq, serde::Serialize, schemars::JsonSchema, serde::Deserialize)]
pub struct Suffix {
pub size: u32,
#[serde(default)]
pub remove: bool,
}
impl super::CaptureStrategy for Suffix {
fn capture(&self, contents: &[u8]) -> Option<(Value, isize)> {
is_valid_size(contents, self.size).then(|| {
let index = contents.len() - self.size as usize;
let value = Value::Bytes(Bytes::copy_from_slice(&contents[index..]));
(value, if self.remove { self.size as isize } else { 0 })
})
}
}