//! Structured keys. use std::borrow::Borrow; use std::cmp; use std::fmt; use std::hash; /// A type that can be converted into a [`Key`](struct.Key.html). pub trait ToKey { /// Perform the conversion. fn to_key(&self) -> Key; } impl<'a, T> ToKey for &'a T where T: ToKey + ?Sized, { fn to_key(&self) -> Key { (**self).to_key() } } impl<'k> ToKey for Key<'k> { fn to_key(&self) -> Key { Key { key: self.key } } } impl ToKey for str { fn to_key(&self) -> Key { Key::from_str(self) } } /// A key in a structured key-value pair. #[derive(Clone)] pub struct Key<'k> { key: &'k str, } impl<'k> Key<'k> { /// Get a key from a borrowed string. pub fn from_str(key: &'k str) -> Self { Key { key: key } } /// Get a borrowed string from this key. pub fn as_str(&self) -> &str { self.key } } impl<'k> fmt::Debug for Key<'k> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.key.fmt(f) } } impl<'k> fmt::Display for Key<'k> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.key.fmt(f) } } impl<'k> hash::Hash for Key<'k> { fn hash(&self, state: &mut H) where H: hash::Hasher, { self.as_str().hash(state) } } impl<'k, 'ko> PartialEq> for Key<'k> { fn eq(&self, other: &Key<'ko>) -> bool { self.as_str().eq(other.as_str()) } } impl<'k> Eq for Key<'k> {} impl<'k, 'ko> PartialOrd> for Key<'k> { fn partial_cmp(&self, other: &Key<'ko>) -> Option { self.as_str().partial_cmp(other.as_str()) } } impl<'k> Ord for Key<'k> { fn cmp(&self, other: &Self) -> cmp::Ordering { self.as_str().cmp(other.as_str()) } } impl<'k> AsRef for Key<'k> { fn as_ref(&self) -> &str { self.as_str() } } impl<'k> Borrow for Key<'k> { fn borrow(&self) -> &str { self.as_str() } } impl<'k> From<&'k str> for Key<'k> { fn from(s: &'k str) -> Self { Key::from_str(s) } } #[cfg(feature = "std")] mod std_support { use super::*; use std::borrow::Cow; impl ToKey for String { fn to_key(&self) -> Key { Key::from_str(self) } } impl<'a> ToKey for Cow<'a, str> { fn to_key(&self) -> Key { Key::from_str(self) } } } #[cfg(feature = "kv_unstable_sval")] mod sval_support { use super::*; extern crate sval; use self::sval::value::{self, Value}; impl<'a> Value for Key<'a> { fn stream(&self, stream: &mut value::Stream) -> value::Result { self.key.stream(stream) } } } #[cfg(feature = "kv_unstable_serde")] mod serde_support { use super::*; extern crate serde; use self::serde::{Serialize, Serializer}; impl<'a> Serialize for Key<'a> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { self.key.serialize(serializer) } } } #[cfg(test)] mod tests { use super::*; #[test] fn key_from_string() { assert_eq!("a key", Key::from_str("a key").as_str()); } }