mod impls;
#[cfg(any(test, feature = "serde"))]
pub mod serde;
use crate::de::DeserializeSeed;
use crate::{algebraic_value::ser::ValueSerializer, bsatn, buffer::BufWriter, ProductValue, SumValue, ValueWithType};
use crate::{AlgebraicValue, WithTypespace};
use core::marker::PhantomData;
use core::{convert::Infallible, fmt};
use ethnum::{i256, u256};
pub use spacetimedb_bindings_macro::Serialize;
pub trait Serializer: Sized {
type Ok;
type Error: Error;
type SerializeArray: SerializeArray<Ok = Self::Ok, Error = Self::Error>;
type SerializeSeqProduct: SerializeSeqProduct<Ok = Self::Ok, Error = Self::Error>;
type SerializeNamedProduct: SerializeNamedProduct<Ok = Self::Ok, Error = Self::Error>;
fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>;
fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>;
fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>;
fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>;
fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>;
fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error>;
fn serialize_u256(self, v: u256) -> Result<Self::Ok, Self::Error>;
fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>;
fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>;
fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>;
fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>;
fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error>;
fn serialize_i256(self, v: i256) -> Result<Self::Ok, Self::Error>;
fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>;
fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>;
fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>;
fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error>;
fn serialize_array(self, len: usize) -> Result<Self::SerializeArray, Self::Error>;
fn serialize_seq_product(self, len: usize) -> Result<Self::SerializeSeqProduct, Self::Error>;
fn serialize_named_product(self, len: usize) -> Result<Self::SerializeNamedProduct, Self::Error>;
fn serialize_named_product_raw(self, value: &ValueWithType<'_, ProductValue>) -> Result<Self::Ok, Self::Error> {
let val = &value.val.elements;
assert_eq!(val.len(), value.ty().elements.len());
let mut prod = self.serialize_named_product(val.len())?;
for (val, el_ty) in val.iter().zip(&*value.ty().elements) {
prod.serialize_element(el_ty.name().map(|n| &**n), &value.with(&el_ty.algebraic_type, val))?
}
prod.end()
}
fn serialize_variant_raw(self, sum: &ValueWithType<'_, SumValue>) -> Result<Self::Ok, Self::Error> {
let sv = sum.value();
let (tag, val) = (sv.tag, &*sv.value);
let var_ty = &sum.ty().variants[tag as usize]; self.serialize_variant(tag, var_ty.name().map(|n| &**n), &sum.with(&var_ty.algebraic_type, val))
}
fn serialize_variant<T: Serialize + ?Sized>(
self,
tag: u8,
name: Option<&str>,
value: &T,
) -> Result<Self::Ok, Self::Error>;
unsafe fn serialize_bsatn<Ty>(self, ty: &Ty, bsatn: &[u8]) -> Result<Self::Ok, Self::Error>
where
for<'a, 'de> WithTypespace<'a, Ty>: DeserializeSeed<'de, Output: Into<AlgebraicValue>>,
{
let res = unsafe { ValueSerializer.serialize_bsatn(ty, bsatn) };
let value = res.unwrap_or_else(|x| match x {});
value.serialize(self)
}
unsafe fn serialize_bsatn_in_chunks<'a, Ty, I: Clone + Iterator<Item = &'a [u8]>>(
self,
ty: &Ty,
total_bsatn_len: usize,
bsatn: I,
) -> Result<Self::Ok, Self::Error>
where
for<'b, 'de> WithTypespace<'b, Ty>: DeserializeSeed<'de, Output: Into<AlgebraicValue>>,
{
let res = unsafe { ValueSerializer.serialize_bsatn_in_chunks(ty, total_bsatn_len, bsatn) };
let value = res.unwrap_or_else(|x| match x {});
value.serialize(self)
}
unsafe fn serialize_str_in_chunks<'a, I: Clone + Iterator<Item = &'a [u8]>>(
self,
total_len: usize,
string: I,
) -> Result<Self::Ok, Self::Error> {
let res = unsafe { ValueSerializer.serialize_str_in_chunks(total_len, string) };
let value = res.unwrap_or_else(|x| match x {});
value.serialize(self)
}
}
pub trait Serialize {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
#[doc(hidden)]
fn serialize_into_bsatn<W: BufWriter>(
&self,
serializer: bsatn::Serializer<'_, W>,
) -> Result<(), bsatn::EncodeError> {
self.serialize(serializer)
}
#[doc(hidden)]
#[inline(always)]
fn __serialize_array<S: Serializer>(this: &[Self], serializer: S) -> Result<S::Ok, S::Error>
where
Self: Sized,
{
let mut vec = serializer.serialize_array(this.len())?;
for elem in this {
vec.serialize_element(elem)?;
}
vec.end()
}
}
pub trait Error {
fn custom<T: fmt::Display>(msg: T) -> Self;
}
impl Error for String {
fn custom<T: fmt::Display>(msg: T) -> Self {
msg.to_string()
}
}
impl Error for std::convert::Infallible {
fn custom<T: fmt::Display>(msg: T) -> Self {
panic!("error generated for Infallible serializer: {msg}")
}
}
pub trait SerializeArray {
type Ok;
type Error: Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, element: &T) -> Result<(), Self::Error>;
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub trait SerializeSeqProduct {
type Ok;
type Error: Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, element: &T) -> Result<(), Self::Error>;
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub trait SerializeNamedProduct {
type Ok;
type Error: Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, name: Option<&str>, elem: &T) -> Result<(), Self::Error>;
fn end(self) -> Result<Self::Ok, Self::Error>;
}
pub struct ForwardNamedToSeqProduct<S> {
tup: S,
}
impl<S> ForwardNamedToSeqProduct<S> {
pub fn new(tup: S) -> Self {
Self { tup }
}
pub fn forward<Ser>(ser: Ser, len: usize) -> Result<Self, Ser::Error>
where
Ser: Serializer<SerializeSeqProduct = S>,
{
ser.serialize_seq_product(len).map(Self::new)
}
}
impl<S: SerializeSeqProduct> SerializeNamedProduct for ForwardNamedToSeqProduct<S> {
type Ok = S::Ok;
type Error = S::Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, _name: Option<&str>, elem: &T) -> Result<(), Self::Error> {
self.tup.serialize_element(elem)
}
fn end(self) -> Result<Self::Ok, Self::Error> {
self.tup.end()
}
}
pub struct Impossible<Ok, Error> {
absurd: Infallible,
marker: PhantomData<(Ok, Error)>,
}
impl<Ok, Error: self::Error> SerializeArray for Impossible<Ok, Error> {
type Ok = Ok;
type Error = Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, _: &T) -> Result<(), Self::Error> {
match self.absurd {}
}
fn end(self) -> Result<Self::Ok, Self::Error> {
match self.absurd {}
}
}
impl<Ok, Error: self::Error> SerializeSeqProduct for Impossible<Ok, Error> {
type Ok = Ok;
type Error = Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, _: &T) -> Result<(), Self::Error> {
match self.absurd {}
}
fn end(self) -> Result<Self::Ok, Self::Error> {
match self.absurd {}
}
}
impl<Ok, Error: self::Error> SerializeNamedProduct for Impossible<Ok, Error> {
type Ok = Ok;
type Error = Error;
fn serialize_element<T: Serialize + ?Sized>(&mut self, _: Option<&str>, _: &T) -> Result<(), Self::Error> {
match self.absurd {}
}
fn end(self) -> Result<Self::Ok, Self::Error> {
match self.absurd {}
}
}