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
use std::io::{Error as IOError, Write}; use std::string::FromUtf8Error; pub trait Output { fn write(&mut self, seg: &str) -> Result<(), IOError>; } pub struct WriteOutput<W: Write> { write: W, } impl<W: Write> Output for WriteOutput<W> { fn write(&mut self, seg: &str) -> Result<(), IOError> { self.write.write_all(seg.as_bytes()) } } impl<W: Write> WriteOutput<W> { pub fn new(write: W) -> WriteOutput<W> { WriteOutput { write } } } pub struct StringOutput { buf: Vec<u8>, } impl Output for StringOutput { fn write(&mut self, seg: &str) -> Result<(), IOError> { for b in seg.as_bytes() { self.buf.push(*b); } Ok(()) } } impl StringOutput { pub fn new() -> StringOutput { StringOutput { buf: Vec::with_capacity(8 * 1024), } } pub fn to_string(self) -> Result<String, FromUtf8Error> { String::from_utf8(self.buf) } }