mercust-msgpack 0.0.1

Rust implementation for mercury-msgpack.
Documentation
use mercust::filter_elements::FilterElement;


/// Serialize a `mercust` filter element into `mercury-msgpack` bytes.
/// 
/// Example:
/// 
/// ```
/// use mercust::filter_elements::{FilterElement, FilterOperation};
/// use mercust_msgpack::{serialize_filter_element, deserialize_filter_element};
/// use maplit::hashmap;
/// 
/// let filter_element = FilterElement::Dict {
///     op: FilterOperation::All,
///     data: Some(hashmap! {
///         "value".to_string() => FilterElement::TypeDeclaration {
///             op: FilterOperation::TypeMatch,
///             data: Some(Box::new(FilterElement::TypeTensor {
///                 op: FilterOperation::All,
///                 data: Some(vec![
///                     FilterElement::Dim {
///                         op: FilterOperation::Eq,
///                         data: Some(5)
///                     }
///                 ])
///             }))
///         }
///     })
/// };
/// let serialized = serialize_filter_element(&filter_element).unwrap();
/// let deserialized = deserialize_filter_element(&serialized).unwrap();
/// assert_eq!(filter_element, deserialized);
/// ```
pub fn serialize_filter_element(filter_element: &FilterElement) -> Result<Vec<u8>, ()> {
    rmp_serde::encode::to_vec(filter_element).map_err(|_| ())
}

/// Deserialize a `mercust` filter element from `mercury-msgpack` bytes.
/// 
/// Example:
/// 
/// ```
/// use mercust::filter_elements::{FilterElement, FilterOperation};
/// use mercust_msgpack::{serialize_filter_element, deserialize_filter_element};
/// use maplit::hashmap;
/// 
/// let filter_element = FilterElement::Dict {
///     op: FilterOperation::All,
///     data: Some(hashmap! {
///         "value".to_string() => FilterElement::TypeDeclaration {
///             op: FilterOperation::TypeMatch,
///             data: Some(Box::new(FilterElement::TypeTensor {
///                 op: FilterOperation::All,
///                 data: Some(vec![
///                     FilterElement::Dim {
///                         op: FilterOperation::Eq,
///                         data: Some(5)
///                     }
///                 ])
///             }))
///         }
///     })
/// };
/// let serialized = serialize_filter_element(&filter_element).unwrap();
/// let deserialized = deserialize_filter_element(&serialized).unwrap();
/// assert_eq!(filter_element, deserialized);
/// ```
pub fn deserialize_filter_element(data: &[u8]) -> Result<FilterElement, ()> {
    rmp_serde::decode::from_slice(data).map_err(|_| ())
}

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

    use maplit::hashmap;
    use mercust::filter_elements::FilterOperation;

    #[test]
    fn test_serde_cycle() {
        let filter_element = FilterElement::Dict {
            op: FilterOperation::All,
            data: Some(hashmap! {
                "value".to_string() => FilterElement::TypeDeclaration {
                    op: FilterOperation::TypeMatch,
                    data: Some(Box::new(FilterElement::TypeTensor {
                        op: FilterOperation::All,
                        data: Some(vec![
                            FilterElement::Dim {
                                op: FilterOperation::Eq,
                                data: Some(5)
                            }
                        ])
                    }))
                }
            })
        };

        let serialized = serialize_filter_element(&filter_element).unwrap();
        let deserialized = deserialize_filter_element(&serialized).unwrap();

        assert_eq!(filter_element, deserialized);
    }
}