From 9b13557781ebe235731b3fb9239fe8b6306ab81f Mon Sep 17 00:00:00 2001
From: Chris Wong <lambda.fairy@gmail.com>
Date: Wed, 18 Feb 2015 20:28:44 +1300
Subject: [PATCH] Switch to new std::io module

---
 maud/src/lib.rs           | 52 ++++++++++++++++++++++-----------------
 maud_macros/src/render.rs |  2 +-
 2 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/maud/src/lib.rs b/maud/src/lib.rs
index 901126a..1c6e397 100644
--- a/maud/src/lib.rs
+++ b/maud/src/lib.rs
@@ -156,11 +156,11 @@
 #![feature(io)]
 
 use std::fmt;
-use std::old_io::{IoError, IoErrorKind, IoResult};
+use std::io;
 
 /// Escape an HTML value.
 pub fn escape(s: &str) -> String {
-    use std::fmt::Writer;
+    use std::fmt::Write;
     let mut buf = String::new();
     rt::Escaper { inner: &mut buf }.write_str(s).unwrap();
     buf
@@ -174,32 +174,40 @@ pub struct Markup<F> {
     callback: F,
 }
 
-impl<F> Markup<F> where F: Fn(&mut fmt::Writer) -> fmt::Result {
-    /// Render the markup to a `std::io::Writer`.
-    pub fn render(&self, w: &mut Writer) -> IoResult<()> {
-        struct WriterWrapper<'a, 'b: 'a> {
-            inner: &'a mut (Writer + 'b),
+impl<F> Markup<F> where F: Fn(&mut fmt::Write) -> fmt::Result {
+    /// Render the markup to a `std::io::Write`.
+    pub fn render<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
+        struct Adaptor<'a, W: ?Sized + 'a> {
+            inner: &'a mut W,
+            error: io::Result<()>,
         }
-        impl<'a, 'b> fmt::Writer for WriterWrapper<'a, 'b> {
+
+        impl<'a, W: ?Sized + io::Write> fmt::Write for Adaptor<'a, W> {
             fn write_str(&mut self, s: &str) -> fmt::Result {
-                self.inner.write_str(s).map_err(|_| fmt::Error)
+                match self.inner.write_all(s.as_bytes()) {
+                    Ok(()) => Ok(()),
+                    Err(e) => {
+                        self.error = Err(e);
+                        Err(fmt::Error)
+                    },
+                }
             }
         }
-        self.render_fmt(&mut WriterWrapper { inner: w })
-            .map_err(|_| IoError {
-                kind: IoErrorKind::OtherIoError,
-                desc: "formatting error",
-                detail: None,
-            })
+
+        let mut output = Adaptor { inner: w, error: Ok(()) };
+        match self.render_fmt(&mut output) {
+            Ok(()) => Ok(()),
+            Err(_) => output.error,
+        }
     }
 
-    /// Render the markup to a `std::fmt::Writer`.
-    pub fn render_fmt(&self, w: &mut fmt::Writer) -> fmt::Result {
+    /// Render the markup to a `std::fmt::Write`.
+    pub fn render_fmt(&self, w: &mut fmt::Write) -> fmt::Result {
         (self.callback)(w)
     }
 }
 
-impl<F> ToString for Markup<F> where F: Fn(&mut fmt::Writer) -> fmt::Result {
+impl<F> ToString for Markup<F> where F: Fn(&mut fmt::Write) -> fmt::Result {
     fn to_string(&self) -> String {
         let mut buf = String::new();
         self.render_fmt(&mut buf).unwrap();
@@ -216,7 +224,7 @@ pub mod rt {
 
     #[inline]
     pub fn make_markup<F>(f: F) -> Markup<F>
-        where F: Fn(&mut fmt::Writer) -> fmt::Result
+        where F: Fn(&mut fmt::Write) -> fmt::Result
     {
         Markup { callback: f }
     }
@@ -227,15 +235,15 @@ pub mod rt {
     ///
     /// See <https://github.com/rust-lang/rust/issues/16617>
     #[inline]
-    pub fn write_fmt<T: fmt::Display>(w: &mut fmt::Writer, value: T) -> fmt::Result {
+    pub fn write_fmt<T: fmt::Display>(w: &mut fmt::Write, value: T) -> fmt::Result {
         write!(w, "{}", value)
     }
 
     pub struct Escaper<'a, 'b: 'a> {
-        pub inner: &'a mut (fmt::Writer + 'b),
+        pub inner: &'a mut (fmt::Write + 'b),
     }
 
-    impl<'a, 'b> fmt::Writer for Escaper<'a, 'b> {
+    impl<'a, 'b> fmt::Write for Escaper<'a, 'b> {
         fn write_str(&mut self, s: &str) -> fmt::Result {
             for c in s.chars() {
                 try!(match c {
diff --git a/maud_macros/src/render.rs b/maud_macros/src/render.rs
index 51b2de3..d84ee89 100644
--- a/maud_macros/src/render.rs
+++ b/maud_macros/src/render.rs
@@ -42,7 +42,7 @@ impl<'cx, 's> Renderer<'cx, 's> {
     pub fn into_expr(self) -> P<Expr> {
         let Renderer { cx, stmts, w } = self;
         quote_expr!(cx,
-            ::maud::rt::make_markup(|$w: &mut ::std::fmt::Writer| -> Result<(), ::std::fmt::Error> {
+            ::maud::rt::make_markup(|$w: &mut ::std::fmt::Write| -> Result<(), ::std::fmt::Error> {
                 $stmts
                 Ok(())
             }))