use ref_slice::ref_slice;
use std::io::Write;
use super::alias::{ResultType};
pub struct TextWriterState<'r, T: 'r + Write> {
writer: &'r mut T,
previous: bool,
delimiter: u8,
}
impl<'r, T: 'r + Write> TextWriterState<'r, T> {
#[inline]
pub fn new(writer: &'r mut T, delimiter: u8) -> TextWriterState<'r, T> {
TextWriterState {
writer: writer,
previous: false,
delimiter: delimiter,
}
}
pub fn export<'a, Value, Callback>(&mut self, value: &'a Value, callback: &Callback)
-> ResultType<()>
where Callback: Fn(&mut T, &'a Value) -> ResultType<()>
{
if self.previous {
self.writer.write_all(ref_slice(&self.delimiter))?;
}
match callback(self.writer, value) {
Err(e) => {
self.previous = false;
Err(e)
},
Ok(()) => {
self.previous = true;
Ok(())
}
}
}
}