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
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(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error>; fn render(&self) -> Result<String, std::fmt::Error> { let mut v = String::new(); self.render_into(&mut v)?; Ok(v) } } impl Render for () { fn render_into(&self, _: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { Ok(()) } } impl<'a, R: Render> Render for &'a R { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { (*self).render_into(w) } } impl Render for usize { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self) } } impl Render for isize { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self) } } impl Render for i32 { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self) } } impl Render for u32 { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self) } } impl<'a> Render for &'a str { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", HTMLEscape::new(self.as_bytes())) } } impl Render for String { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", HTMLEscape::new(self.as_bytes())) } } pub struct PreEscaped<S: AsRef<str>>(pub S); impl<S: AsRef<str>> Render for PreEscaped<S> { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self.0.as_ref()) } } impl Render for uuid::Uuid { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { write!(w, "{}", self) } } use std::borrow::Borrow; impl<'a> Render for std::borrow::Cow<'a, str> { fn render_into(&self, w: &mut std::fmt::Write) -> Result<(), std::fmt::Error> { let r: &str = self.borrow(); r.render_into(w) } }