fieldmasker 0.0.1

A utility for selecting and filtering response fields via field masks.
Documentation
use crate::spec::{MaskSpec, Node};
use std::collections::BTreeMap;

macro_rules! impl_scalar {
    ($t:ty $(,)?) => {
        impl MaskSpec for $t {
            fn mask_spec() -> &'static Node {
                static N: Node = Node::scalar();
                &N
            }
        }
    };
}

impl_scalar!(bool);
impl_scalar!(i8);
impl_scalar!(i16);
impl_scalar!(i32);
impl_scalar!(i64);
impl_scalar!(isize);
impl_scalar!(u8);
impl_scalar!(u16);
impl_scalar!(u32);
impl_scalar!(u64);
impl_scalar!(usize);
impl_scalar!(f32);
impl_scalar!(f64);
impl_scalar!(String);
impl_scalar!(&str);

impl<T: MaskSpec> MaskSpec for Option<T> {
    fn mask_spec() -> &'static Node {
        T::mask_spec()
    }
}

impl<T: MaskSpec> MaskSpec for Box<T> {
    fn mask_spec() -> &'static Node {
        T::mask_spec()
    }
}

impl<T: MaskSpec> MaskSpec for Vec<T> {
    fn mask_spec() -> &'static Node {
        Box::leak(Box::new(Node::array(T::mask_spec().clone())))
    }
}

impl<V: MaskSpec> MaskSpec for std::collections::HashMap<String, V> {
    fn mask_spec() -> &'static Node {
        Box::leak(Box::new(Node::map(V::mask_spec().clone())))
    }
}

impl<V: MaskSpec> MaskSpec for BTreeMap<String, V> {
    fn mask_spec() -> &'static Node {
        Box::leak(Box::new(Node::map(V::mask_spec().clone())))
    }
}

#[cfg(feature = "hashbrown")]
impl<V: MaskSpec> MaskSpec for hashbrown::HashMap<String, V> {
    fn mask_spec() -> &'static Node {
        Box::leak(Box::new(Node::map(V::mask_spec().clone())))
    }
}