Make Escaper own the wrapped writer, not borrow it

This commit is contained in:
Chris Wong 2015-09-16 11:45:57 +12:00
parent b50a3be6f6
commit 5676895dd9
2 changed files with 12 additions and 15 deletions
maud/src
maud_macros/src

View file

@ -15,29 +15,26 @@ use std::io;
/// ``` /// ```
/// # use maud::Escaper; /// # use maud::Escaper;
/// use std::fmt::Write; /// use std::fmt::Write;
/// let mut result = String::new(); /// write!(Escaper::new(String::new()), "<script>launchMissiles()</script>").unwrap();
/// write!(Escaper::new(&mut result), "<script>launchMissiles()</script>").unwrap(); /// assert_eq!(result.into_inner(), "&lt;script&gt;launchMissiles()&lt;/script&gt;");
/// assert_eq!(result, "&lt;script&gt;launchMissiles()&lt;/script&gt;");
/// ``` /// ```
pub struct Escaper<'a> { pub struct Escaper<W: fmt::Write> {
// FIXME: store the writer directly instead of borrowing it inner: W,
// see <https://github.com/rust-lang/rust/pull/28368>
inner: &'a mut fmt::Write,
} }
impl<'a> Escaper<'a> { impl<W: fmt::Write> Escaper<W> {
/// Creates an `Escaper` from a `std::fmt::Write`. /// Creates an `Escaper` from a `std::fmt::Write`.
pub fn new(inner: &'a mut fmt::Write) -> Escaper<'a> { pub fn new(inner: W) -> Escaper<W> {
Escaper { inner: inner } Escaper { inner: inner }
} }
/// Extracts the inner writer. /// Extracts the inner writer.
pub fn into_inner(self) -> &'a mut fmt::Write { pub fn into_inner(self) -> W {
self.inner self.inner
} }
} }
impl<'a> fmt::Write for Escaper<'a> { impl<W: fmt::Write> fmt::Write for Escaper<W> {
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
for c in s.chars() { for c in s.chars() {
try!(match c { try!(match c {

View file

@ -134,7 +134,7 @@ impl<'cx> Renderer<'cx> {
Escape::Escape => Escape::Escape =>
quote_expr!(self.cx, quote_expr!(self.cx,
write!( write!(
::maud::Escaper::new($w), ::maud::Escaper::new(&mut *$w),
"{}", "{}",
$expr)), $expr)),
}; };
@ -194,7 +194,7 @@ impl<'cx> Renderer<'cx> {
fn html_escape(s: &str) -> String { fn html_escape(s: &str) -> String {
use std::fmt::Write; use std::fmt::Write;
let mut out = String::new(); let mut escaper = Escaper::new(String::new());
Escaper::new(&mut out).write_str(s).unwrap(); escaper.write_str(s).unwrap();
out escaper.into_inner()
} }