mod real; use core::marker::PhantomData; use super::{ Write, Serialize, Serializer }; use self::real::{ RealSerializer, PrimitiveRealSerializer, FastRealSerializer }; use crate::grammar::*; pub trait Config { type RealSerializer: RealSerializer; } pub struct DefaultConfig {} impl Config for DefaultConfig { type RealSerializer = FastRealSerializer; } pub struct BaseSerializer { out: W, cfg: PhantomData } impl BaseSerializer where C: Config, W: Write { pub fn new(out: W) -> Self { Self { out, cfg: PhantomData } } pub fn into_inner(self) -> W { self.out } #[inline] pub fn serialize_real(&mut self, r: R) -> Result<(), W::Error> where C::RealSerializer: PrimitiveRealSerializer { C::RealSerializer::serialize_real::(&mut self.out, r) } #[inline] fn write_delim(&mut self, delim: u8) -> Result<(), W::Error> { self.out.write(&[delim]) } #[inline] fn write_utf8(&mut self, s: &str) -> Result<(), W::Error> { self.out.write(s.as_bytes()) } } impl Serializer for &mut BaseSerializer { type Error = W::Error; #[inline] fn serialize_real_u8(self, real: u8) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_u16(self, real: u16) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_u32(self, real: u32) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_u64(self, real: u64) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_i8(self, real: i8) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_i16(self, real: i16) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_i32(self, real: i32) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_i64(self, real: i64) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_f32(self, real: f32) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_real_f64(self, real: f64) -> Result<(), Self::Error> { self.serialize_real::(real) } #[inline] fn serialize_unit<'a, V>(self, name: &'a str, value: V) -> Result<(), Self::Error> where V: Serialize { self.serialize_atom(name)?; self.write_delim(GRAMMAR_PAREN_OPEN)?; self.serialize_any(value)?; self.write_delim(GRAMMAR_PAREN_CLOSE) } #[inline] fn serialize_atom<'a>(self, atom: &'a str) -> Result<(), Self::Error> { self.write_utf8(atom) } #[inline] fn serialize_text<'a>(self, text: &'a str) -> Result<(), Self::Error> { self.write_delim(GRAMMAR_QUOTE)?; self.write_utf8(text)?; self.write_delim(GRAMMAR_QUOTE) } #[inline] fn serialize_multiline_text<'a, M>(self, lines: M) -> Result<(), Self::Error> where M: IntoIterator { self.write_delim(GRAMMAR_BTICK)?; for line in lines.into_iter() { self.serialize_text(line)?; } self.write_delim(GRAMMAR_BTICK) } #[inline] fn serialize_dict(self, dict: D) -> Result<(), Self::Error> where K: Serialize, V: Serialize, D: IntoIterator { self.write_delim(GRAMMAR_BRACE_OPEN)?; let mut first = true; for (k, v) in dict.into_iter() { if first { first = false; } else { self.write_delim(GRAMMAR_COMMA)?; } self.serialize_any(&k)?; self.write_delim(GRAMMAR_COLON)?; self.serialize_any(&v)?; } self.write_delim(GRAMMAR_BRACE_CLOSE) } #[inline] fn serialize_list(self, list: L) -> Result<(), Self::Error> where T: Serialize, L: IntoIterator { self.write_delim(GRAMMAR_BRKET_OPEN)?; let mut first = true; for v in list.into_iter() { if first { first = false; } else { self.write_delim(GRAMMAR_COMMA)?; } self.serialize_any(&v)?; } self.write_delim(GRAMMAR_BRKET_CLOSE) } }