use core::fmt;
use super::TokenKey;
pub unsafe trait InternKey: Copy + Eq + fmt::Debug {
fn into_u32(self) -> u32;
fn try_from_u32(key: u32) -> Option<Self>;
}
pub trait Resolver<Key: InternKey = TokenKey> {
fn try_resolve(&self, key: Key) -> Option<&str>;
fn resolve(&self, key: Key) -> &str {
self.try_resolve(key)
.unwrap_or_else(|| panic!("failed to resolve `{key:?}`"))
}
}
impl<R: Resolver> Resolver for &R {
fn try_resolve(&self, key: TokenKey) -> Option<&str> {
(**self).try_resolve(key)
}
fn resolve(&self, key: TokenKey) -> &str {
(**self).resolve(key)
}
}
impl<R: Resolver> Resolver for &mut R {
fn try_resolve(&self, key: TokenKey) -> Option<&str> {
(**self).try_resolve(key)
}
fn resolve(&self, key: TokenKey) -> &str {
(**self).resolve(key)
}
}
pub trait Interner<Key: InternKey = TokenKey>: Resolver<Key> {
type Error;
fn try_get_or_intern(&mut self, text: &str) -> Result<Key, Self::Error>;
fn get_or_intern(&mut self, text: &str) -> Key {
self.try_get_or_intern(text)
.unwrap_or_else(|_| panic!("failed to intern `{text:?}`"))
}
}
impl<I: Interner> Interner for &mut I {
type Error = I::Error;
fn try_get_or_intern(&mut self, text: &str) -> Result<TokenKey, Self::Error> {
(**self).try_get_or_intern(text)
}
fn get_or_intern(&mut self, text: &str) -> TokenKey {
(**self).get_or_intern(text)
}
}