use crate::de::TEXT_KEY;
use crate::errors::serialize::DeError;
use crate::se::simple_type::{SimpleSeq, SimpleTypeSerializer};
use serde::ser::{Impossible, Serialize, Serializer};
use serde::serde_if_integer128;
use std::fmt::Write;
macro_rules! write_primitive {
($method:ident ( $ty:ty )) => {
#[inline]
fn $method(self, value: $ty) -> Result<Self::Ok, Self::Error> {
self.0.$method(value)
}
};
}
pub struct TextSerializer<'i, W: Write>(pub SimpleTypeSerializer<'i, W>);
impl<'i, W: Write> Serializer for TextSerializer<'i, W> {
type Ok = W;
type Error = DeError;
type SerializeSeq = SimpleSeq<'i, W>;
type SerializeTuple = SimpleSeq<'i, W>;
type SerializeTupleStruct = SimpleSeq<'i, W>;
type SerializeTupleVariant = SimpleSeq<'i, W>;
type SerializeMap = Impossible<Self::Ok, Self::Error>;
type SerializeStruct = Impossible<Self::Ok, Self::Error>;
type SerializeStructVariant = Impossible<Self::Ok, Self::Error>;
write_primitive!(serialize_bool(bool));
write_primitive!(serialize_i8(i8));
write_primitive!(serialize_i16(i16));
write_primitive!(serialize_i32(i32));
write_primitive!(serialize_i64(i64));
write_primitive!(serialize_u8(u8));
write_primitive!(serialize_u16(u16));
write_primitive!(serialize_u32(u32));
write_primitive!(serialize_u64(u64));
serde_if_integer128! {
write_primitive!(serialize_i128(i128));
write_primitive!(serialize_u128(u128));
}
write_primitive!(serialize_f32(f32));
write_primitive!(serialize_f64(f64));
write_primitive!(serialize_char(char));
write_primitive!(serialize_str(&str));
write_primitive!(serialize_bytes(&[u8]));
#[inline]
fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
self.0.serialize_none()
}
fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
value.serialize(self)
}
#[inline]
fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
self.0.serialize_unit()
}
#[inline]
fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
self.0.serialize_unit_struct(name)
}
#[inline]
fn serialize_unit_variant(
self,
name: &'static str,
variant_index: u32,
variant: &'static str,
) -> Result<Self::Ok, Self::Error> {
if variant == TEXT_KEY {
Ok(self.0.writer)
} else {
self.0.serialize_unit_variant(name, variant_index, variant)
}
}
fn serialize_newtype_struct<T: ?Sized + Serialize>(
self,
_name: &'static str,
value: &T,
) -> Result<Self::Ok, Self::Error> {
value.serialize(self)
}
#[inline]
fn serialize_newtype_variant<T: ?Sized + Serialize>(
self,
name: &'static str,
_variant_index: u32,
variant: &'static str,
_value: &T,
) -> Result<Self::Ok, Self::Error> {
Err(DeError::Unsupported(
format!(
"cannot serialize enum newtype variant `{}::{}` as text content value",
name, variant
)
.into(),
))
}
#[inline]
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
self.0.serialize_seq(len)
}
#[inline]
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
self.0.serialize_tuple(len)
}
#[inline]
fn serialize_tuple_struct(
self,
name: &'static str,
len: usize,
) -> Result<Self::SerializeTupleStruct, Self::Error> {
self.0.serialize_tuple_struct(name, len)
}
#[inline]
fn serialize_tuple_variant(
self,
name: &'static str,
_variant_index: u32,
variant: &'static str,
_len: usize,
) -> Result<Self::SerializeTupleVariant, Self::Error> {
Err(DeError::Unsupported(
format!(
"cannot serialize enum tuple variant `{}::{}` as text content value",
name, variant
)
.into(),
))
}
#[inline]
fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
Err(DeError::Unsupported(
"cannot serialize map as text content value".into(),
))
}
#[inline]
fn serialize_struct(
self,
name: &'static str,
_len: usize,
) -> Result<Self::SerializeStruct, Self::Error> {
Err(DeError::Unsupported(
format!("cannot serialize struct `{}` as text content value", name).into(),
))
}
#[inline]
fn serialize_struct_variant(
self,
name: &'static str,
_variant_index: u32,
variant: &'static str,
_len: usize,
) -> Result<Self::SerializeStructVariant, Self::Error> {
Err(DeError::Unsupported(
format!(
"cannot serialize enum struct variant `{}::{}` as text content value",
name, variant
)
.into(),
))
}
}