pktscope-core 0.2.0

Core engine for pktscope: live/offline capture, protocol decoders, flow tracking, filters, and egress monitoring
Documentation
use std::io::Write;

use crate::decode::DecodedPacket;

pub fn write_json_line(writer: &mut impl Write, pkt: &DecodedPacket) -> anyhow::Result<()> {
    serde_json::to_writer(&mut *writer, pkt)?;
    writer.write_all(b"\n")?;
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::decode::*;

    #[test]
    fn test_json_roundtrip() {
        let pkt = DecodedPacket {
            number: 42,
            timestamp: chrono::Utc::now(),
            wire_len: 100,
            data: vec![0xDE, 0xAD, 0xBE, 0xEF],
            layers: vec![Layer::Payload { offset: 0, len: 4 }],
            summary: PacketSummary {
                source: "10.0.0.1".into(),
                destination: "10.0.0.2".into(),
                protocol: "TCP".into(),
                length: 100,
                info: "test".into(),
                color_hint: ColorHint::Tcp,
            },
            process: None,
            retransmission: false,
        };

        let mut buf = Vec::new();
        write_json_line(&mut buf, &pkt).unwrap();

        let json_str = String::from_utf8(buf).unwrap();
        assert!(json_str.ends_with('\n'));
        let parsed: serde_json::Value = serde_json::from_str(json_str.trim()).unwrap();
        assert_eq!(parsed["number"], 42);
        assert_eq!(parsed["wire_len"], 100);
    }
}