falco_event_serde 0.5.1

Serde support for falco_event types
Documentation
use super::{StaticRepr, TaggedRepr};
use crate::de::repr::Repr::Static;
use bstr::BString;
use falco_event_schema::fields::types;
use serde::Deserialize;
use serde::Deserializer;
use std::marker::PhantomData;

macro_rules! impl_deserialize_bstr {
    ($tag:ty) => {
        impl<'de> Deserialize<'de> for TaggedRepr<$tag> {
            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
            where
                D: Deserializer<'de>,
            {
                let path: BString = Deserialize::deserialize(deserializer)?;
                let mut buf: Vec<u8> = path.into();
                buf.push(b'\0');
                Ok(Self {
                    repr: Static(StaticRepr::Vec(buf)),
                    tag: PhantomData,
                })
            }
        }
    };
}

impl_deserialize_bstr!(&'_ types::PT_CHARBUF);
impl_deserialize_bstr!(&'_ types::PT_FSPATH);
impl_deserialize_bstr!(types::PT_FSRELPATH<'_>);

impl<'de> Deserialize<'de> for TaggedRepr<&types::PT_BYTEBUF> {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let buf: BString = Deserialize::deserialize(deserializer)?;

        Ok(Self {
            repr: Static(StaticRepr::Vec(Vec::from(buf.as_slice()))),
            tag: PhantomData,
        })
    }
}

impl<'de> Deserialize<'de> for TaggedRepr<types::PT_CHARBUFARRAY<'_>> {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let arr: Vec<BString> = Deserialize::deserialize(deserializer)?;
        let mut buf = Vec::new();
        for item in arr {
            buf.extend_from_slice(item.as_slice());
            buf.push(b'\0');
        }

        Ok(Self {
            repr: Static(StaticRepr::Vec(buf)),
            tag: PhantomData,
        })
    }
}

impl<'de> Deserialize<'de> for TaggedRepr<types::PT_CHARBUF_PAIR_ARRAY<'_>> {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let arr: Vec<(BString, BString)> = Deserialize::deserialize(deserializer)?;
        let mut buf = Vec::new();
        for (k, v) in arr {
            buf.extend_from_slice(k.as_slice());
            buf.push(b'\0');
            buf.extend_from_slice(v.as_slice());
            buf.push(b'\0');
        }

        Ok(Self {
            repr: Static(StaticRepr::Vec(buf)),
            tag: PhantomData,
        })
    }
}