serde-hashkey 0.4.5

Space efficient, in-memory serde serialization which supports hashing.
Documentation
#![cfg(feature = "ordered-float")]

use serde_derive::{Deserialize, Serialize};
use serde_hashkey::{
    from_key, to_key, to_key_with_ordered_float, Error, Float, Integer, Key, OrderedFloat, RejectFloatPolicy
};
use std::collections::BTreeMap;

#[test]
fn test_map() -> Result<(), Error> {
    let foo = Foo {
        name: String::from("Hello World"),
    };

    let mut map = BTreeMap::new();
    map.insert(&foo, String::from("bar"));

    match to_key(&map)? {
        Key::Map(_) => (),
        other => panic!("unexpected: {:?}", other),
    }

    match to_key(&foo)? {
        Key::Map(_) => (),
        other => panic!("unexpected: {:?}", other),
    }

    return Ok(());

    #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize)]
    struct Foo {
        name: String,
    }
}

#[test]
fn test_enum() -> Result<(), Error> {
    let foo = Foo::Operation1(String::from("Foo"), String::from("Bar"));
    let value = to_key(&foo)?;

    match &value {
        Key::Map(_) => (),
        other => panic!("unexpected: {:?}", other),
    }

    assert_eq!(foo, from_key(&value)?);
    assert_eq!(Foo::Operation3, from_key(&to_key(&Foo::Operation3)?)?);
    return Ok(());

    #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
    enum Foo {
        Operation1(String, String),
        Operation2(String),
        Operation3,
    }
}

#[test]
fn test_width() {
    assert_eq!(24, std::mem::size_of::<Integer>());
    assert!(std::mem::size_of::<Key>() <= 32 && std::mem::size_of::<Key>() >= 24);
}

#[test]
fn test_normalize() {
    let a = Key::<RejectFloatPolicy>::Map(
        vec![
            (Key::String("baz".into()), Key::String("biz".into())),
            (Key::String("foo".into()), Key::String("bar".into())),
        ]
        .into(),
    );

    let b = Key::Map(
        vec![
            (Key::String("foo".into()), Key::String("bar".into())),
            (Key::String("baz".into()), Key::String("biz".into())),
        ]
        .into(),
    );

    assert_ne!(a, b);
    assert_eq!(a, b.clone().normalize());
    assert_eq!(a.clone().normalize(), b.clone().normalize());
}

#[test]
fn deny_floats_by_default() {
    assert_eq!(to_key(&0f32), Err(Error::UnsupportedType("f32")));
    assert_eq!(to_key(&0f64), Err(Error::UnsupportedType("f64")));
    assert_eq!(
        to_key_with_ordered_float(&0f32),
        Ok(Key::Float(Float::F32(OrderedFloat(0f32))))
    );
    assert_eq!(
        to_key_with_ordered_float(&0f64),
        Ok(Key::Float(Float::F64(OrderedFloat(0f64))))
    );
}