desert_core 0.1.5

Binary serialization library for Rust (core crate)
Documentation
use crate::binary_output::BinaryOutput;
use crate::deserializer::DeserializationContext;
use crate::serializer::SerializationContext;
use crate::{BinaryDeserializer, BinarySerializer, Error, Result};
use url::Url;

impl BinarySerializer for Url {
    fn serialize<Output: BinaryOutput>(
        &self,
        context: &mut SerializationContext<Output>,
    ) -> Result<()> {
        self.as_str().serialize(context)
    }
}

impl BinaryDeserializer for Url {
    fn deserialize(context: &mut DeserializationContext<'_>) -> Result<Self> {
        let s = String::deserialize(context)?;
        Url::parse(&s)
            .map_err(|e| Error::DeserializationFailure(format!("Failed to parse URL: {}", e)))
    }
}

#[cfg(test)]
mod tests {
    use crate::tests::roundtrip;
    use proptest::prelude::*;
    use test_r::test;
    use url::Url;

    fn url_strategy() -> impl Strategy<Value = Url> {
        prop_oneof![
            Just(Url::parse("http://example.com").unwrap()),
            Just(Url::parse("https://www.google.com/search?q=test").unwrap()),
            Just(Url::parse("ftp://ftp.example.com/file.txt").unwrap()),
            Just(Url::parse("mailto:user@example.com").unwrap()),
            any::<String>().prop_filter_map("valid url", |s| {
                if s.is_empty() || s.contains('\0') || s.contains('\n') {
                    None
                } else {
                    Url::parse(&s).ok()
                }
            })
        ]
    }

    proptest! {
        #[test]
        fn test_url(value in url_strategy()) {
            roundtrip(value);
        }
    }
}