changeset 77:72076befe75f

Genericize LinesWriter over the sink type
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 07 Feb 2016 09:33:06 +0000
parents 8d84dcb8f264
children 64de3fd37c35
files src/formats/fake.rs src/formats/lines.rs
diffstat 2 files changed, 13 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/formats/fake.rs	Sun Feb 07 09:20:22 2016 +0000
+++ b/src/formats/fake.rs	Sun Feb 07 09:33:06 2016 +0000
@@ -1,6 +1,7 @@
 #![allow(dead_code)]
 
 use formats::util::MRSinkGenerator;
+use formats::lines::LinesWriter;
 
 pub struct BufWriterSinkGen {
     // bogus field so the struct isn't empty
@@ -8,8 +9,8 @@
 }
 
 impl MRSinkGenerator for BufWriterSinkGen {
-    type Sink = Vec<u8>;
+    type Sink = LinesWriter<Vec<u8>>;
     fn new_output(&mut self, _: &String) -> Self::Sink {
-        Vec::new()
+        LinesWriter::new_to_write(Vec::new())
     }
 }
--- a/src/formats/lines.rs	Sun Feb 07 09:20:22 2016 +0000
+++ b/src/formats/lines.rs	Sun Feb 07 09:33:06 2016 +0000
@@ -72,18 +72,21 @@
 }
 
 /// Writer that separates the chunks written by '\n' characters.
-pub struct LinesWriter {
-    file: fs::File,
+pub struct LinesWriter<W: io::Write> {
+    file: W,
 }
 
-impl LinesWriter {
-    pub fn new_to_file(path: &String) -> io::Result<LinesWriter> {
+impl<W: io::Write> LinesWriter<W> {
+    pub fn new_to_file(path: &String) -> io::Result<LinesWriter<fs::File>> {
         let f = try!(fs::OpenOptions::new().write(true).create(true).truncate(true).open(path));
         Ok(LinesWriter { file: f })
     }
+    pub fn new_to_write(w: W) -> LinesWriter<W> {
+        LinesWriter { file: w }
+    }
 }
 
-impl io::Write for LinesWriter {
+impl<W: io::Write> io::Write for LinesWriter<W> {
     fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
         self.file.write(buf).and(self.file.write(&['\n' as u8]))
     }
@@ -101,13 +104,13 @@
 impl LinesSinkGenerator {
     /// Use either a path like `/a/b/c/` to generate files in a directory
     /// or `/a/b/c/file_prefix_` to create files with that prefix.
-    pub fn new(path: &String) -> LinesSinkGenerator {
+    pub fn new_to_files(path: &String) -> LinesSinkGenerator {
         LinesSinkGenerator { basepath: path.clone() }
     }
 }
 
 impl util::MRSinkGenerator for LinesSinkGenerator {
-    type Sink = LinesWriter;
+    type Sink = LinesWriter<fs::File>;
     fn new_output(&mut self, name: &String) -> Self::Sink {
         let mut path = self.basepath.clone();
         path.push_str(&name[..]);
@@ -119,7 +122,6 @@
     }
 }
 
-
 #[cfg(test)]
 mod test {
     use formats::lines;