Mercurial > lbo > hg > localmr
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;