//! 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<H>(&self, state: &mut H) | |
where | |
H: hash::Hasher, | |
{ | |
self.as_str().hash(state) | |
} | |
} | |
impl<'k, 'ko> PartialEq<Key<'ko>> 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<Key<'ko>> for Key<'k> { | |
fn partial_cmp(&self, other: &Key<'ko>) -> Option<cmp::Ordering> { | |
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<str> for Key<'k> { | |
fn as_ref(&self) -> &str { | |
self.as_str() | |
} | |
} | |
impl<'k> Borrow<str> 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(test)] | |
mod tests { | |
use super::*; | |
#[test] | |
fn key_from_string() { | |
assert_eq!("a key", Key::from_str("a key").as_str()); | |
} | |
} |