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}