mercust_msgpack/
filter.rs

1use mercust::filter_elements::FilterElement;
2
3
4/// Serialize a `mercust` filter element into `mercury-msgpack` bytes.
5/// 
6/// Example:
7/// 
8/// ```
9/// use mercust::filter_elements::{FilterElement, FilterOperation};
10/// use mercust_msgpack::{serialize_filter_element, deserialize_filter_element};
11/// use maplit::hashmap;
12/// 
13/// let filter_element = FilterElement::Dict {
14///     op: FilterOperation::All,
15///     data: Some(hashmap! {
16///         "value".to_string() => FilterElement::TypeDeclaration {
17///             op: FilterOperation::TypeMatch,
18///             data: Some(Box::new(FilterElement::TypeTensor {
19///                 op: FilterOperation::All,
20///                 data: Some(vec![
21///                     FilterElement::Dim {
22///                         op: FilterOperation::Eq,
23///                         data: Some(5)
24///                     }
25///                 ])
26///             }))
27///         }
28///     })
29/// };
30/// let serialized = serialize_filter_element(&filter_element).unwrap();
31/// let deserialized = deserialize_filter_element(&serialized).unwrap();
32/// assert_eq!(filter_element, deserialized);
33/// ```
34pub fn serialize_filter_element(filter_element: &FilterElement) -> Result<Vec<u8>, ()> {
35    rmp_serde::encode::to_vec(filter_element).map_err(|_| ())
36}
37
38/// Deserialize a `mercust` filter element from `mercury-msgpack` bytes.
39/// 
40/// Example:
41/// 
42/// ```
43/// use mercust::filter_elements::{FilterElement, FilterOperation};
44/// use mercust_msgpack::{serialize_filter_element, deserialize_filter_element};
45/// use maplit::hashmap;
46/// 
47/// let filter_element = FilterElement::Dict {
48///     op: FilterOperation::All,
49///     data: Some(hashmap! {
50///         "value".to_string() => FilterElement::TypeDeclaration {
51///             op: FilterOperation::TypeMatch,
52///             data: Some(Box::new(FilterElement::TypeTensor {
53///                 op: FilterOperation::All,
54///                 data: Some(vec![
55///                     FilterElement::Dim {
56///                         op: FilterOperation::Eq,
57///                         data: Some(5)
58///                     }
59///                 ])
60///             }))
61///         }
62///     })
63/// };
64/// let serialized = serialize_filter_element(&filter_element).unwrap();
65/// let deserialized = deserialize_filter_element(&serialized).unwrap();
66/// assert_eq!(filter_element, deserialized);
67/// ```
68pub fn deserialize_filter_element(data: &[u8]) -> Result<FilterElement, ()> {
69    rmp_serde::decode::from_slice(data).map_err(|_| ())
70}
71
72#[cfg(test)]
73mod tests {
74    use super::*;
75
76    use maplit::hashmap;
77    use mercust::filter_elements::FilterOperation;
78
79    #[test]
80    fn test_serde_cycle() {
81        let filter_element = FilterElement::Dict {
82            op: FilterOperation::All,
83            data: Some(hashmap! {
84                "value".to_string() => FilterElement::TypeDeclaration {
85                    op: FilterOperation::TypeMatch,
86                    data: Some(Box::new(FilterElement::TypeTensor {
87                        op: FilterOperation::All,
88                        data: Some(vec![
89                            FilterElement::Dim {
90                                op: FilterOperation::Eq,
91                                data: Some(5)
92                            }
93                        ])
94                    }))
95                }
96            })
97        };
98
99        let serialized = serialize_filter_element(&filter_element).unwrap();
100        let deserialized = deserialize_filter_element(&serialized).unwrap();
101
102        assert_eq!(filter_element, deserialized);
103    }
104}