//! Yet another version of owned string, backed by a syntax tree token. use std::{cmp::Ordering, fmt, ops}; use rowan::GreenToken; pub struct TokenText<'a>(pub(crate) Repr<'a>); pub(crate) enum Repr<'a> { Borrowed(&'a str), Owned(GreenToken), } impl<'a> TokenText<'a> { pub(crate) fn borrowed(text: &'a str) -> Self { TokenText(Repr::Borrowed(text)) } pub(crate) fn owned(green: GreenToken) -> Self { TokenText(Repr::Owned(green)) } pub fn as_str(&self) -> &str { match self.0 { Repr::Borrowed(it) => it, Repr::Owned(ref green) => green.text(), } } } impl ops::Deref for TokenText<'_> { type Target = str; fn deref(&self) -> &str { self.as_str() } } impl AsRef for TokenText<'_> { fn as_ref(&self) -> &str { self.as_str() } } impl From> for String { fn from(token_text: TokenText) -> Self { token_text.as_str().into() } } impl PartialEq<&'_ str> for TokenText<'_> { fn eq(&self, other: &&str) -> bool { self.as_str() == *other } } impl PartialEq> for &'_ str { fn eq(&self, other: &TokenText) -> bool { other == self } } impl PartialEq for TokenText<'_> { fn eq(&self, other: &String) -> bool { self.as_str() == other.as_str() } } impl PartialEq> for String { fn eq(&self, other: &TokenText) -> bool { other == self } } impl PartialEq for TokenText<'_> { fn eq(&self, other: &TokenText) -> bool { self.as_str() == other.as_str() } } impl Eq for TokenText<'_> {} impl Ord for TokenText<'_> { fn cmp(&self, other: &Self) -> Ordering { self.as_str().cmp(other.as_str()) } } impl PartialOrd for TokenText<'_> { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) } } impl fmt::Display for TokenText<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Display::fmt(self.as_str(), f) } } impl fmt::Debug for TokenText<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fmt::Debug::fmt(self.as_str(), f) } }