use crate::{DatagramParser, FlowSide, SessionParser, Timestamp};
#[derive(Debug, Default, Clone)]
pub struct NoopSessionParser;
impl SessionParser for NoopSessionParser {
type Message = ();
fn feed_initiator(&mut self, _bytes: &[u8], _ts: Timestamp) -> Vec<()> {
Vec::new()
}
fn feed_responder(&mut self, _bytes: &[u8], _ts: Timestamp) -> Vec<()> {
Vec::new()
}
}
#[derive(Debug, Default, Clone)]
pub struct NoopDatagramParser;
impl DatagramParser for NoopDatagramParser {
type Message = ();
fn parse(&mut self, _payload: &[u8], _side: FlowSide, _ts: Timestamp) -> Vec<()> {
Vec::new()
}
}
#[derive(Debug, Default, Clone)]
pub struct EchoSessionParser;
impl SessionParser for EchoSessionParser {
type Message = (FlowSide, Vec<u8>);
fn feed_initiator(&mut self, bytes: &[u8], _ts: Timestamp) -> Vec<Self::Message> {
vec![(FlowSide::Initiator, bytes.to_vec())]
}
fn feed_responder(&mut self, bytes: &[u8], _ts: Timestamp) -> Vec<Self::Message> {
vec![(FlowSide::Responder, bytes.to_vec())]
}
}
#[derive(Debug, Default, Clone)]
pub struct OneShotSessionParser {
done: bool,
}
impl SessionParser for OneShotSessionParser {
type Message = ();
fn feed_initiator(&mut self, _bytes: &[u8], _ts: Timestamp) -> Vec<()> {
self.done = true;
vec![()]
}
fn feed_responder(&mut self, _bytes: &[u8], _ts: Timestamp) -> Vec<()> {
Vec::new()
}
fn is_done(&self) -> bool {
self.done
}
fn parser_kind(&self) -> &'static str {
"one-shot-session"
}
}
#[derive(Debug, Default, Clone)]
pub struct OneShotDatagramParser {
done: bool,
}
impl DatagramParser for OneShotDatagramParser {
type Message = ();
fn parse(&mut self, _payload: &[u8], _side: FlowSide, _ts: Timestamp) -> Vec<()> {
self.done = true;
vec![()]
}
fn is_done(&self) -> bool {
self.done
}
fn parser_kind(&self) -> &'static str {
"one-shot-datagram"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn noop_session_compiles() {
let mut p = NoopSessionParser;
assert!(p.feed_initiator(b"hi", Timestamp::default()).is_empty());
assert!(p.feed_responder(b"hi", Timestamp::default()).is_empty());
}
#[test]
fn noop_datagram_compiles() {
let mut p = NoopDatagramParser;
assert!(
p.parse(b"hi", FlowSide::Initiator, Timestamp::default())
.is_empty()
);
}
#[test]
fn echo_session_emits_chunks() {
let mut p = EchoSessionParser;
let m = p.feed_initiator(b"hello", Timestamp::default());
assert_eq!(m.len(), 1);
assert_eq!(m[0].0, FlowSide::Initiator);
assert_eq!(m[0].1, b"hello");
}
}