1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
extern crate cuach_derive; extern crate uuid; extern crate v_htmlescape; use v_htmlescape::HTMLEscape; pub use cuach_derive::template; pub trait Render { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error>; fn render(&self) -> Result<String, anyhow::Error> { let mut v = String::new(); self.render_into(&mut v)?; Ok(v) } } impl Render for () { fn render_into<W: std::fmt::Write>(&self, _: &mut W) -> Result<(), anyhow::Error> { Ok(()) } } impl<'a, R: Render> Render for &'a R { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok((*self).render_into(w)?) } } impl Render for usize { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl Render for isize { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl Render for i32 { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl Render for i64 { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl Render for u32 { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl Render for u64 { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } impl<'a> Render for &'a str { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", HTMLEscape::new(self.as_bytes()))?) } } impl Render for String { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", HTMLEscape::new(self.as_bytes()))?) } } #[derive(Debug, Clone)] pub struct PreEscaped<S: AsRef<str>>(pub S); impl<S: AsRef<str>> Render for PreEscaped<S> { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self.0.as_ref())?) } } impl Render for uuid::Uuid { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { Ok(write!(w, "{}", self)?) } } use std::borrow::Borrow; impl<'a> Render for std::borrow::Cow<'a, str> { fn render_into<W: std::fmt::Write>(&self, w: &mut W) -> Result<(), anyhow::Error> { let r: &str = self.borrow(); r.render_into(w) } }