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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
use crate::error; use crate::value; use std::io; #[derive(Debug)] pub struct Source<R>(io::Lines<io::BufReader<R>>) where R: io::Read; #[derive(Debug)] pub struct Sink<W>(io::LineWriter<W>) where W: io::Write; #[inline] pub fn source<R>(r: R) -> Source<R> where R: io::Read, { use std::io::BufRead; Source(io::BufReader::new(r).lines()) } #[inline] pub fn sink<W>(w: W) -> Sink<W> where W: io::Write, { Sink(io::LineWriter::new(w)) } impl<R> value::Source for Source<R> where R: io::Read, { #[inline] fn read(&mut self) -> error::Result<Option<value::Value>> { match self.0.next() { Some(Ok(v)) => Ok(Some(value::Value::String(v))), Some(Err(e)) => Err(error::Error::from(e)), None => Ok(None), } } } impl<W> value::Sink for Sink<W> where W: io::Write, { #[inline] fn write(&mut self, value: value::Value) -> error::Result<()> { use std::io::Write; match value { value::Value::String(s) => { self.0.write_all(s.as_bytes())?; self.0.write_all(b"\n")?; Ok(()) } value::Value::Bytes(b) => { self.0.write_all(&b)?; self.0.write_all(b"\n")?; Ok(()) } value::Value::Char(c) => { writeln!(self.0, "{}", c)?; Ok(()) } x => Err(error::Error::Format { msg: format!("raw can only output strings, bytes and chars, got: {:?}", x), }), } } }