lfml/types/
markup.rs

1pub struct Escaped<T>(pub T);
2
3impl<T: std::fmt::Display> Escaped<T> {
4    pub fn as_string(&self) -> String {
5        self.0.to_string()
6    }
7}
8
9pub trait Render {
10    fn markup(&self) -> Escaped<String> {
11        let mut buf = String::new();
12        self.markup_to_string(&mut buf);
13        Escaped(buf)
14    }
15
16    fn markup_to_string(&self, buf: &mut String) {
17        buf.push_str(&self.markup().as_string())
18    }
19}
20
21impl<T: std::fmt::Display> Render for Escaped<T> {
22    fn markup_to_string(&self, buf: &mut String) {
23        buf.push_str(&self.as_string())
24    }
25}
26
27impl Render for str {
28    fn markup_to_string(&self, buf: &mut String) {
29        lfml_escape::escape_to_string(self, buf);
30    }
31}
32
33impl Render for String {
34    fn markup_to_string(&self, buf: &mut String) {
35        str::markup_to_string(self, buf)
36    }
37}
38
39impl<'a, T: Render + ?Sized> Render for &'a T {
40    fn markup_to_string(&self, buf: &mut String) {
41        T::markup_to_string(self, buf);
42    }
43}
44
45impl<'a, T: Render + ?Sized> Render for &'a mut T {
46    fn markup_to_string(&self, buf: &mut String) {
47        T::markup_to_string(self, buf);
48    }
49}
50
51macro_rules! impl_render_for_integer_types {
52    ($($ty:ty)*) => {
53        $(
54            impl Render for $ty {
55                fn markup_to_string(&self, w: &mut String) {
56                    w.push_str(itoa::Buffer::new().format(*self));
57                }
58            }
59        )*
60    };
61}
62
63impl_render_for_integer_types! {
64    i8 i16 i32 i64 i128 isize
65    u8 u16 u32 u64 u128 usize
66}