use std::fmt;
#[derive(Debug, PartialEq, Eq, Clone)]
pub enum ImmutStr {
Static(&'static str),
Owned(Box<str>),
}
impl ImmutStr {
#[inline]
pub fn as_str(&self) -> &str {
match self {
ImmutStr::Static(s) => s,
ImmutStr::Owned(s) => s.as_ref(),
}
}
pub fn is_owned(&self) -> bool {
match self {
ImmutStr::Static(_) => false,
ImmutStr::Owned(_) => true,
}
}
}
impl fmt::Display for ImmutStr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_str())
}
}
impl From<&'static str> for ImmutStr {
fn from(s: &'static str) -> Self {
ImmutStr::Static(s)
}
}
impl From<String> for ImmutStr {
fn from(s: String) -> Self {
ImmutStr::Owned(s.into_boxed_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_static_vs_owned() {
let s: ImmutStr = "test".into();
assert!(!s.is_owned());
let s: ImmutStr = "test".to_string().into();
assert!(s.is_owned());
}
}