use std::marker::PhantomData;
use crate::config::WriterOptions;
use crate::error::WriteError;
use crate::raw_writer::RawWriter;
use crate::sink::Sink;
use crate::{RootArrayBuilder, RootObjectBuilder};
pub struct Empty;
pub struct Filled;
pub struct Writer<S: Sink, State = Empty> {
pub(crate) raw: RawWriter<S>,
_state: PhantomData<State>,
}
impl<S: Sink, State> Writer<S, State> {
pub fn bytes_written(&self) -> u64 {
self.raw.bytes_written()
}
pub fn padding_bytes_written(&self) -> u64 {
self.raw.padding_bytes_written()
}
pub fn buffered_bytes(&self) -> usize {
self.raw.buffered_bytes()
}
}
impl<S: Sink> Writer<S, Empty> {
pub fn new(sink: S) -> Self {
Self {
raw: RawWriter::new(sink),
_state: PhantomData,
}
}
pub fn with_options(sink: S, opts: WriterOptions) -> Result<Self, WriteError> {
Ok(Self {
raw: RawWriter::with_options(sink, opts)?,
_state: PhantomData,
})
}
pub fn push_null(mut self) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_null()?;
Ok(self.into_filled())
}
pub fn push_bool(mut self, v: bool) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_bool(v)?;
Ok(self.into_filled())
}
pub fn push_i64(mut self, v: i64) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_i64(v)?;
Ok(self.into_filled())
}
pub fn push_u64(mut self, v: u64) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_u64(v)?;
Ok(self.into_filled())
}
pub fn push_f64(mut self, v: f64) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_f64(v)?;
Ok(self.into_filled())
}
pub fn push_str(mut self, s: &str) -> Result<Writer<S, Filled>, WriteError> {
self.raw.push_str(s)?;
Ok(self.into_filled())
}
pub fn start_array(self) -> RootArrayBuilder<S> {
RootArrayBuilder::new(self.into_raw())
}
pub fn start_object(self) -> RootObjectBuilder<S> {
RootObjectBuilder::new(self.into_raw())
}
fn into_filled(self) -> Writer<S, Filled> {
Writer {
raw: self.raw,
_state: PhantomData,
}
}
pub(crate) fn into_raw(self) -> RawWriter<S> {
self.raw
}
}
impl<S: Sink> Writer<S, Filled> {
pub(crate) fn from_raw(raw: RawWriter<S>) -> Self {
Self {
raw,
_state: PhantomData,
}
}
pub fn finish(self) -> Result<S, WriteError> {
self.raw.finish()
}
}