use std::ops::Deref;
use ref_cast::RefCast;
use crate::http::RawStr;
#[repr(transparent)]
#[derive(RefCast, Debug, PartialEq, Eq, Hash)]
pub struct Key(str);
impl Key {
pub fn new<S: AsRef<str> + ?Sized>(string: &S) -> &Key {
Key::ref_cast(string.as_ref())
}
pub fn indices(&self) -> impl Iterator<Item = &str> {
self.split(':')
}
pub fn as_str(&self) -> &str {
self
}
}
impl Deref for Key {
type Target = str;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl serde::Serialize for Key {
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(ser)
}
}
impl<'de: 'a, 'a> serde::Deserialize<'de> for &'a Key {
fn deserialize<D>(de: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
<&'a str as serde::Deserialize<'de>>::deserialize(de).map(Key::new)
}
}
impl<I: core::slice::SliceIndex<str, Output = str>> core::ops::Index<I> for Key {
type Output = Key;
#[inline]
fn index(&self, index: I) -> &Self::Output {
self.0[index].into()
}
}
impl PartialEq<str> for Key {
fn eq(&self, other: &str) -> bool {
self == Key::new(other)
}
}
impl PartialEq<Key> for str {
fn eq(&self, other: &Key) -> bool {
Key::new(self) == other
}
}
impl<'a, S: AsRef<str> + ?Sized> From<&'a S> for &'a Key {
#[inline]
fn from(string: &'a S) -> Self {
Key::new(string)
}
}
impl AsRef<Key> for str {
fn as_ref(&self) -> &Key {
Key::new(self)
}
}
impl AsRef<Key> for RawStr {
fn as_ref(&self) -> &Key {
Key::new(self)
}
}
impl std::fmt::Display for Key {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}