1pub use cuach_derive_tex::template;
2
3pub trait Render {
4 type Error;
5 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error>;
6 fn render(&self) -> Result<String, Self::Error> {
7 let mut v = String::new();
8 self.render_into(&mut v)?;
9 Ok(v)
10 }
11}
12
13impl Render for () {
14 type Error = std::convert::Infallible;
15 fn render_into<W: std::fmt::Write>(&self, _: &mut W) -> Result<(), Self::Error> {
16 Ok(())
17 }
18}
19
20impl<'a, R: Render> Render for &'a R {
21 type Error = R::Error;
22 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
23 Ok((*self).render_into(w)?)
24 }
25}
26
27impl Render for usize {
28 type Error = std::fmt::Error;
29 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
30 Ok(write!(w, "{}", self)?)
31 }
32}
33
34impl Render for isize {
35 type Error = std::fmt::Error;
36 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
37 Ok(write!(w, "{}", self)?)
38 }
39}
40
41impl Render for i32 {
42 type Error = std::fmt::Error;
43 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
44 Ok(write!(w, "{}", self)?)
45 }
46}
47
48impl Render for i64 {
49 type Error = std::fmt::Error;
50 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
51 Ok(write!(w, "{}", self)?)
52 }
53}
54
55impl Render for u32 {
56 type Error = std::fmt::Error;
57 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
58 Ok(write!(w, "{}", self)?)
59 }
60}
61
62impl Render for u64 {
63 type Error = std::fmt::Error;
64 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
65 Ok(write!(w, "{}", self)?)
66 }
67}
68
69impl Render for f32 {
70 type Error = std::fmt::Error;
71 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
72 Ok(write!(w, "{}", self)?)
73 }
74}
75
76impl Render for f64 {
77 type Error = std::fmt::Error;
78 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
79 Ok(write!(w, "{}", self)?)
80 }
81}
82
83impl<'a> Render for &'a str {
84 type Error = std::fmt::Error;
85 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
86 Ok(write!(w, "{}", ESCAPE.replace_all(self, "\\$1"))?)
87 }
88}
89
90lazy_static::lazy_static! {
91 static ref ESCAPE: regex::Regex = regex::Regex::new("([\\%$_{}])").unwrap();
92}
93
94
95impl Render for String {
96 type Error = std::fmt::Error;
97 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
98 Ok(write!(w, "{}", ESCAPE.replace_all(self, "\\$1"))?)
99 }
100}
101
102#[derive(Debug, Clone)]
103pub struct PreEscaped<S: AsRef<str>>(pub S);
104
105impl<S: AsRef<str>> Render for PreEscaped<S> {
106 type Error = std::fmt::Error;
107 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
108 Ok(write!(w, "{}", self.0.as_ref())?)
109 }
110}
111
112use std::borrow::Borrow;
113impl<'a> Render for std::borrow::Cow<'a, str> {
114 type Error = std::fmt::Error;
115 fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), Self::Error> {
116 let r: &str = self.borrow();
117 r.render_into(w)
118 }
119}