Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion serde_core/src/de/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,11 @@ pub mod value;

mod ignored_any;
mod impls;
mod remote;

pub use self::ignored_any::IgnoredAny;
pub use self::remote::RemoteDeserialize;

#[cfg(all(not(feature = "std"), no_core_error))]
#[doc(no_inline)]
pub use crate::std_error::Error as StdError;
Expand All @@ -131,7 +134,6 @@ pub use core::error::Error as StdError;
#[cfg(feature = "std")]
#[doc(no_inline)]
pub use std::error::Error as StdError;

////////////////////////////////////////////////////////////////////////////////

macro_rules! declare_error_trait {
Expand Down
9 changes: 9 additions & 0 deletions serde_core/src/de/remote.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use crate::Deserializer;

/// TODO
pub trait RemoteDeserialize<'de, Remote> where Remote: Sized {
/// TODO
fn deserialize<D>(deserializer: D) -> Result<Remote, D::Error>
where
D: Deserializer<'de>;
}
3 changes: 2 additions & 1 deletion serde_core/src/ser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,10 @@ use crate::lib::*;
mod fmt;
mod impls;
mod impossible;
mod remote;

pub use self::impossible::Impossible;

pub use self::remote::RemoteSerialize;
#[cfg(all(not(feature = "std"), no_core_error))]
#[doc(no_inline)]
pub use crate::std_error::Error as StdError;
Expand Down
9 changes: 9 additions & 0 deletions serde_core/src/ser/remote.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
use crate::Serializer;

/// TODO
pub trait RemoteSerialize<Remote> {
/// TODO
fn serialize<S>(origin: &Remote, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
}
15 changes: 13 additions & 2 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,26 @@ pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result<To
quote! {
#[automatically_derived]
#allow_deprecated
impl #de_impl_generics #ident #ty_generics #where_clause {
#vis fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<#remote #ty_generics, __D::Error>
impl #de_impl_generics _serde::de::RemoteDeserialize<#delife, #remote #ty_generics> for #ident #ty_generics #where_clause {
fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<#remote #ty_generics, __D::Error>
where
__D: _serde::Deserializer<#delife>,
{
#used
#body
}
}

#[automatically_derived]
#allow_deprecated
impl #de_impl_generics #ident #ty_generics #where_clause {
#vis fn deserialize<__D>(__deserializer: __D) -> _serde::#private::Result<#remote #ty_generics, __D::Error>
where
__D: _serde::Deserializer<#delife>,
{
<#ident #ty_generics as _serde::de::RemoteDeserialize::<#delife, #remote #ty_generics>>::deserialize(__deserializer)
}
}
}
} else {
let fn_deserialize_in_place = deserialize_in_place_body(&cont, &params);
Expand Down
15 changes: 13 additions & 2 deletions serde_derive/src/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,26 @@ pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result<Toke
quote! {
#[automatically_derived]
#allow_deprecated
impl #impl_generics #ident #ty_generics #where_clause {
#vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
impl #impl_generics _serde::ser::RemoteSerialize<#remote #ty_generics> for #ident #ty_generics #where_clause {
fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
where
__S: _serde::Serializer,
{
#used
#body
}
}

#[automatically_derived]
#allow_deprecated
impl #impl_generics #ident #ty_generics #where_clause {
#vis fn serialize<__S>(__self: &#remote #ty_generics, __serializer: __S) -> _serde::#private::Result<__S::Ok, __S::Error>
where
__S: _serde::Serializer,
{
<#ident #ty_generics as _serde::ser::RemoteSerialize::<#remote #ty_generics>>::serialize(__self, __serializer)
}
}
}
} else {
quote! {
Expand Down