use std::io::Write;
use crate::{MetaMap, RpcValue, Value, reader::{ContainerType, MapKey}};
pub type WriteResult = std::io::Result<usize>;
pub(crate) struct ByteWriter<'a, W>
{
write: &'a mut W,
cnt: usize,
}
impl<'a, W> ByteWriter<'a, W>
where W: Write
{
pub(crate) fn new(write: &'a mut W) -> Self {
ByteWriter {
write,
cnt: 0,
}
}
pub(crate) fn count(&self) -> usize { self.cnt }
pub(crate) fn write_byte(&mut self, b: u8) -> WriteResult {
let arr: [u8; 1] = [b];
let n = self.write.write(&arr)?;
self.cnt += n;
Ok(n)
}
pub(crate) fn write_bytes(&mut self, b: &[u8]) -> WriteResult {
let n = self.write.write(b)?;
self.cnt += n;
Ok(n)
}
}
pub trait Writer {
fn write(&mut self, rv: &RpcValue) -> WriteResult;
fn write_meta(&mut self, m: &MetaMap) -> WriteResult;
fn write_value(&mut self, v: &Value) -> WriteResult;
fn write_key(&mut self, key: &MapKey) -> WriteResult;
fn write_delimiter(&mut self) -> WriteResult;
fn write_indent(&mut self) -> WriteResult;
fn write_container_begin(&mut self, container_type: ContainerType) -> WriteResult;
fn write_container_end(&mut self, container_type: ContainerType, is_empty: Option<bool>) -> WriteResult;
}