cuach_tex/
lib.rs

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}