use crate::Error;
use crate::io::{ReadBuffer, WriteBuffer};
pub trait Format: Send + Sync {
fn name(&self) -> &'static str;
fn encode_struct<T: crate::Encode + ?Sized, W: WriteBuffer>(
val: &T,
w: &mut W,
) -> Result<(), Error>;
fn write_null(w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_bool(v: bool, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_u64(v: u64, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_i64(v: i64, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_f64(v: f64, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_str(v: &str, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_bytes(v: &[u8], w: &mut impl WriteBuffer) -> Result<(), Error>;
fn begin_object(n_fields: usize, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn write_field_key(key: &[u8], w: &mut impl WriteBuffer) -> Result<(), Error>;
fn field_separator(w: &mut impl WriteBuffer) -> Result<(), Error>;
fn end_object(w: &mut impl WriteBuffer) -> Result<(), Error>;
fn begin_array(len: usize, w: &mut impl WriteBuffer) -> Result<(), Error>;
fn array_separator(w: &mut impl WriteBuffer) -> Result<(), Error>;
fn end_array(w: &mut impl WriteBuffer) -> Result<(), Error>;
fn read_bool(r: &mut ReadBuffer<'_>) -> Result<bool, Error>;
fn read_u64(r: &mut ReadBuffer<'_>) -> Result<u64, Error>;
fn read_i64(r: &mut ReadBuffer<'_>) -> Result<i64, Error>;
fn read_f64(r: &mut ReadBuffer<'_>) -> Result<f64, Error>;
fn read_str<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de str, Error>;
fn read_bytes<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de [u8], Error>;
fn read_null(r: &mut ReadBuffer<'_>) -> Result<(), Error>;
fn begin_object_decode(r: &mut ReadBuffer<'_>) -> Result<usize, Error>;
fn read_field_key<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de str, Error>;
fn end_object_decode(r: &mut ReadBuffer<'_>) -> Result<(), Error>;
fn begin_array_decode(r: &mut ReadBuffer<'_>) -> Result<usize, Error>;
fn end_array_decode(r: &mut ReadBuffer<'_>) -> Result<(), Error>;
fn skip_value(r: &mut ReadBuffer<'_>) -> Result<(), Error>;
}
#[allow(dead_code)]
pub struct JsonFormat;
impl Format for JsonFormat {
#[inline(always)]
fn name(&self) -> &'static str {
"json"
}
#[inline(always)]
fn encode_struct<T: crate::Encode + ?Sized, W: WriteBuffer>(
val: &T,
w: &mut W,
) -> Result<(), Error> {
val.encode(w)
}
#[inline(always)]
fn write_null(w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_bytes(b"null")
}
#[inline(always)]
fn write_bool(v: bool, w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_bytes(if v { b"true" } else { b"false" })
}
#[inline(always)]
fn write_u64(v: u64, w: &mut impl WriteBuffer) -> Result<(), Error> {
crate::codec::write_u64(v, w)
}
#[inline(always)]
fn write_i64(v: i64, w: &mut impl WriteBuffer) -> Result<(), Error> {
crate::codec::write_i64(v, w)
}
#[inline(always)]
fn write_f64(v: f64, w: &mut impl WriteBuffer) -> Result<(), Error> {
crate::codec::write_f64(v, w)
}
#[inline(always)]
fn write_str(v: &str, w: &mut impl WriteBuffer) -> Result<(), Error> {
crate::codec::write_str(v, w)
}
#[inline(always)]
fn write_bytes(v: &[u8], w: &mut impl WriteBuffer) -> Result<(), Error> {
crate::codec::write_bytes(v, w)
}
#[inline(always)]
fn begin_object(_n_fields: usize, w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b'{')
}
#[inline(always)]
fn write_field_key(key: &[u8], w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b'"')?;
w.write_bytes(key)?;
w.write_bytes(b"\":")
}
#[inline(always)]
fn field_separator(w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b',')
}
#[inline(always)]
fn end_object(w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b'}')
}
#[inline(always)]
fn begin_array(_len: usize, w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b'[')
}
#[inline(always)]
fn array_separator(w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b',')
}
#[inline(always)]
fn end_array(w: &mut impl WriteBuffer) -> Result<(), Error> {
w.write_byte(b']')
}
#[inline(always)]
fn read_bool(r: &mut ReadBuffer<'_>) -> Result<bool, Error> {
crate::codec::read_bool(r)
}
#[inline(always)]
fn read_u64(r: &mut ReadBuffer<'_>) -> Result<u64, Error> {
crate::codec::read_u64(r)
}
#[inline(always)]
fn read_i64(r: &mut ReadBuffer<'_>) -> Result<i64, Error> {
crate::codec::read_i64(r)
}
#[inline(always)]
fn read_f64(r: &mut ReadBuffer<'_>) -> Result<f64, Error> {
crate::codec::read_f64(r)
}
#[inline(always)]
fn read_str<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de str, Error> {
crate::codec::read_string(r)
}
#[inline(always)]
fn read_bytes<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de [u8], Error> {
crate::codec::read_bytes_impl(r)
}
#[inline(always)]
fn read_null(r: &mut ReadBuffer<'_>) -> Result<(), Error> {
crate::codec::read_null(r)
}
#[inline(always)]
fn begin_object_decode(r: &mut ReadBuffer<'_>) -> Result<usize, Error> {
crate::codec::json::skip_whitespace(r);
r.expect_byte(b'{')?;
Ok(0)
}
#[inline(always)]
fn read_field_key<'de>(r: &mut ReadBuffer<'de>) -> Result<&'de str, Error> {
crate::codec::read_string(r)
}
#[inline(always)]
fn end_object_decode(r: &mut ReadBuffer<'_>) -> Result<(), Error> {
r.expect_byte(b'}')
}
#[inline(always)]
fn begin_array_decode(r: &mut ReadBuffer<'_>) -> Result<usize, Error> {
crate::codec::json::skip_whitespace(r);
r.expect_byte(b'[')?;
Ok(0)
}
#[inline(always)]
fn end_array_decode(r: &mut ReadBuffer<'_>) -> Result<(), Error> {
r.expect_byte(b']')
}
#[inline(always)]
fn skip_value(r: &mut ReadBuffer<'_>) -> Result<(), Error> {
crate::codec::skip_value(r)
}
}