use serde::{Serialize, Serializer};
pub trait ContextualSerialize<Context> {
fn contextual_serialize<S: Serializer>(
&self,
serializer: S,
context: &Context,
) -> Result<S::Ok, S::Error>;
fn serialize<S: Serializer, TContext: Into<Context>>(
&self,
serializer: S,
context: TContext,
) -> Result<S::Ok, S::Error> {
self.contextual_serialize(serializer, &context.into())
}
fn serializable<'a, TContext: Into<Context>>(
&'a self,
context: TContext,
) -> ContextSerializable<'a, Self, Context> {
ContextSerializable {
value: self,
context: context.into(),
}
}
}
pub struct ContextSerializable<'a, TValue, TContext>
where
TValue: ContextualSerialize<TContext> + ?Sized,
{
value: &'a TValue,
context: TContext,
}
impl<'a, TValue: ContextualSerialize<TContext> + ?Sized, TContext> Serialize
for ContextSerializable<'a, TValue, TContext>
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.value.contextual_serialize(serializer, &self.context)
}
}