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}