use super::{mode::*, serializer::Serializer as ModalSerializer};
use serde::ser::*;
pub trait SerializeModal {
fn serialize_modal<SerializerT>(
&self,
serializer: SerializerT,
mode: &SerializationMode,
) -> Result<SerializerT::Ok, SerializerT::Error>
where
SerializerT: Serializer;
}
pub trait SerializeModalRescursive {
fn serialize_modal<SerializerT>(
&self,
serializer: SerializerT,
mode: &SerializationMode,
modal_serializer: &ModalSerializer,
) -> Result<SerializerT::Ok, SerializerT::Error>
where
SerializerT: Serializer;
}
pub struct ModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModal,
{
pub serializable: &'own SerializeModalT,
pub mode: &'own SerializationMode,
}
impl<'own, SerializeModalT> ModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModal,
{
pub fn new(serializable: &'own SerializeModalT, mode: &'own SerializationMode) -> Self {
Self { serializable, mode }
}
}
impl<'own, SerializeModalT> Serialize for ModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModal,
{
fn serialize<SerializerT>(&self, serializer: SerializerT) -> Result<SerializerT::Ok, SerializerT::Error>
where
SerializerT: Serializer,
{
self.serializable.serialize_modal(serializer, self.mode)
}
}
pub struct RecursiveModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModalRescursive,
{
pub serializable: &'own SerializeModalT,
pub mode: &'own SerializationMode,
pub serializer: &'own ModalSerializer,
}
impl<'own, SerializeModalT> RecursiveModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModalRescursive,
{
pub fn new(
serializable: &'own SerializeModalT,
mode: &'own SerializationMode,
serializer: &'own ModalSerializer,
) -> Self {
Self { serializable, mode, serializer }
}
}
impl<'own, SerializeModalT> Serialize for RecursiveModalSerializable<'own, SerializeModalT>
where
SerializeModalT: SerializeModalRescursive,
{
fn serialize<SerializerT>(&self, serializer: SerializerT) -> Result<SerializerT::Ok, SerializerT::Error>
where
SerializerT: Serializer,
{
self.serializable.serialize_modal(serializer, self.mode, self.serializer)
}
}
pub trait Modal<SerializeModalT>
where
SerializeModalT: SerializeModal,
{
fn modal<'own>(&'own self, mode: &'own SerializationMode) -> ModalSerializable<'own, SerializeModalT>;
}
impl<SerializeModalT> Modal<SerializeModalT> for SerializeModalT
where
SerializeModalT: SerializeModal,
{
fn modal<'own>(&'own self, mode: &'own SerializationMode) -> ModalSerializable<'own, Self> {
ModalSerializable::new(self, mode)
}
}
pub trait RecursiveModal<SerializeModalT>
where
SerializeModalT: SerializeModalRescursive,
{
fn modal<'own>(
&'own self,
mode: &'own SerializationMode,
serializer: &'own ModalSerializer,
) -> RecursiveModalSerializable<'own, SerializeModalT>;
}
impl<ModalSerializeT> RecursiveModal<ModalSerializeT> for ModalSerializeT
where
ModalSerializeT: SerializeModalRescursive,
{
fn modal<'own>(
&'own self,
mode: &'own SerializationMode,
serializer: &'own ModalSerializer,
) -> RecursiveModalSerializable<'own, Self> {
RecursiveModalSerializable::new(self, mode, serializer)
}
}