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 std::fmt::Write;
/// let mut result = String::new();
/// write!(Escaper::new(&mut result), "<script>launchMissiles()</script>").unwrap();
/// assert_eq!(result, "&lt;script&gt;launchMissiles()&lt;/script&gt;");
/// write!(Escaper::new(String::new()), "<script>launchMissiles()</script>").unwrap();
/// assert_eq!(result.into_inner(), "&lt;script&gt;launchMissiles()&lt;/script&gt;");
/// ```
pub struct Escaper<'a> {
// FIXME: store the writer directly instead of borrowing it
// see <https://github.com/rust-lang/rust/pull/28368>
inner: &'a mut fmt::Write,
pub struct Escaper<W: fmt::Write> {
inner: W,
}
impl<'a> Escaper<'a> {
impl<W: fmt::Write> Escaper<W> {
/// 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 }
}
/// Extracts the inner writer.
pub fn into_inner(self) -> &'a mut fmt::Write {
pub fn into_inner(self) -> W {
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 {
for c in s.chars() {
try!(match c {

View file

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