Serde-based in-memory key serialization which supports hashing.
This allows any serde-serializable type to be converted into a value which
implements PartialEq
, Eq
, ParialOrd
, Ord
, and Hash
.
[Key] is useful because it allows for a form of type-erasure. Let's say you want to build a generic in-memory key-value store where you want to store arbitrary serde-serializable keys. This is typical for things like caches or dependency injection frameworks.
Add the following to your Cargo.toml:
toml
[dependencies]
serde-hashkey = "0.4.2"
By default, [Key] can't include floating point types such as f32
and
f64
. Neither of these are [totally ordered nor hashable].
To enable the [Key] type to use f32
and f64
it can be constructed with a
specific float policy.
Available float policies are:
* [RejectFloat] - the default behavior when using [tokey].
* [OrderedFloat] - the behavior when using [tokeywithordered_float]. The
ordered-float
feature must be enabled to use this. The behavior is
derived from the [ordered-float
crate].
ordered-float
- Enables serializing floating point numbers through
behavior derived from the [ordered-float
crate]You can run this example with
cargo run --example book
```rust use std::collections::HashMap;
use serdederive::{Deserialize, Serialize}; use serdehashkey::{fromkey, tokey, Error, Key};
struct Author { name: String, age: u32, }
struct Book { title: String, author: Author, }
let book = Book { title: String::from("Birds of a feather"), author: Author { name: String::from("Noah"), age: 42, }, };
let key = to_key(&book)?;
let mut ratings = HashMap::new(); ratings.insert(key.clone(), 5);
println!("ratings: {:?}", ratings);
println!( "book as json (through key): {}", serdejson::tostring_pretty(&key)? );
println!( "book as json (through original object): {}", serdejson::tostring_pretty(&book)? );
```
License: MIT/Apache-2.0