use tylift::tylift;
use std::marker::PhantomData;
#[tylift]
pub enum Mode {
Safe,
Fast,
}
pub struct Text<M: Mode> {
content: String,
_marker: PhantomData<M>,
}
impl<M: Mode> Text<M> {
pub fn into_inner(self) -> String {
self.content
}
}
impl Text<Safe> {
pub fn from(content: Vec<u8>) -> Option<Self> {
Some(Self {
content: String::from_utf8(content).ok()?,
_marker: PhantomData,
})
}
}
impl Text<Fast> {
pub fn from(content: Vec<u8>) -> Self {
Self {
content: unsafe { String::from_utf8_unchecked(content) },
_marker: PhantomData,
}
}
}
fn main() {
let safe = Text::<Safe>::from(vec![0x73, 0x61, 0x66, 0x65]);
let fast = Text::<Fast>::from(vec![0x66, 0x61, 0x73, 0x74]);
assert_eq!(safe.map(Text::into_inner), Some("safe".to_owned()));
assert_eq!(fast.into_inner(), "fast".to_owned());
}