use crate::{
value::{Number, Precision, Timestamp},
ArrayWriter, DictWriter, Literal, Writer,
};
pub trait Encoder: Writer {
fn encode_undefined(self) -> Self::Output {
self.write_undefined(None)
}
fn encode_null(self) -> Self::Output {
self.write_null(None)
}
fn encode_bool(self, value: bool) -> Self::Output {
self.write_bool(value, None)
}
fn encode_u64(self, value: u64) -> Self::Output {
self.write_pos(value, None)
}
fn encode_i64(self, value: i64) -> Self::Output {
if value < 0 {
self.write_neg((-1 - value) as u64, None)
} else {
self.write_pos(value as u64, None)
}
}
fn encode_f64(self, value: f64) -> Self::Output {
self.write_lit(Literal::L8(value.to_bits()), None)
}
fn encode_timestamp(self, timestamp: Timestamp, precision: Precision) -> Self::Output {
timestamp.encode(self, precision)
}
fn encode_number(self, number: &Number) -> Self::Output {
number.encode(self)
}
fn encode_str(self, value: impl AsRef<str>) -> Self::Output {
self.write_str(value.as_ref(), None)
}
fn encode_bytes(self, value: impl AsRef<[u8]>) -> Self::Output {
self.write_bytes(value.as_ref(), None)
}
fn encode_array<F>(self, f: F) -> Self::Output
where
F: FnOnce(&mut ArrayWriter<'_>),
{
self.write_array(None, |builder| f(builder))
}
fn encode_dict<F>(self, f: F) -> Self::Output
where
F: FnOnce(&mut DictWriter<'_>),
{
self.write_dict(None, |builder| f(builder))
}
}
impl<T: Writer> Encoder for T {}