1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//! <div align="center">
//!   <a href="https://github.com/udoprog/serde-hashkey/actions">
//!     <img alt="GitHub Actions Build Status" src="https://github.com/udoprog/serde-hashkey/workflows/Build/badge.svg">
//!   </a>
//!
//!   <a href="https://docs.rs/serde-hashkey">
//!     <img alt="Documentation" src="https://docs.rs/serde-hashkey/badge.svg">
//!   </a>
//! </div>
//! 
//! Serde-based in-memory key serialization.
//!
//! This allows any serde-serializable type to be converted into a `Value` which
//! implements `PartialEq`, `Eq`, `ParialOrd`, `Ord`, and `Hash`. The only
//! limitation is that the type can't serialize floating point values. This
//! might be lifted in the future by specifying policies for dealing with
//! non-finite values.
//!
//! `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.
//!
//! ## Examples
//!
//! > You can run this example with `cargo run --example book`
//! 
//! ```rust
//! use serde_derive::{Deserialize, Serialize};
//! use serde_hashkey::{from_key, to_key, Error, Key};
//! use std::{collections::HashMap, error};
//! 
//! #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
//! struct Author {
//!     name: String,
//!     age: u32,
//! }
//! 
//! #[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
//! struct Book {
//!     title: String,
//!     author: Author,
//! }
//! 
//! fn main() -> Result<(), Box<dyn error::Error>> {
//!     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): {}",
//!         serde_json::to_string_pretty(&key)?
//!     );
//! 
//!     println!(
//!         "book as json (through original object): {}",
//!         serde_json::to_string_pretty(&book)?
//!     );
//! 
//!     Ok(())
//! }
//! ```

mod de;
mod error;
mod key;
mod ser;

#[doc(inline)]
pub use crate::de::from_key;
#[doc(inline)]
pub use crate::error::{Error, Result};
#[doc(inline)]
pub use crate::key::{Integer, Key};
#[doc(inline)]
pub use crate::ser::to_key;