diff --git a/serde_core/src/de/mod.rs b/serde_core/src/de/mod.rs index 2518ae682..cb63646b4 100644 --- a/serde_core/src/de/mod.rs +++ b/serde_core/src/de/mod.rs @@ -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; @@ -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 { diff --git a/serde_core/src/de/remote.rs b/serde_core/src/de/remote.rs new file mode 100644 index 000000000..b20a5a904 --- /dev/null +++ b/serde_core/src/de/remote.rs @@ -0,0 +1,9 @@ +use crate::Deserializer; + +/// TODO +pub trait RemoteDeserialize<'de, Remote> where Remote: Sized { + /// TODO + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>; +} \ No newline at end of file diff --git a/serde_core/src/ser/mod.rs b/serde_core/src/ser/mod.rs index 62e59d981..3684f6fb0 100644 --- a/serde_core/src/ser/mod.rs +++ b/serde_core/src/ser/mod.rs @@ -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; diff --git a/serde_core/src/ser/remote.rs b/serde_core/src/ser/remote.rs new file mode 100644 index 000000000..b6743c916 --- /dev/null +++ b/serde_core/src/ser/remote.rs @@ -0,0 +1,9 @@ +use crate::Serializer; + +/// TODO +pub trait RemoteSerialize { + /// TODO + fn serialize(origin: &Remote, serializer: S) -> Result + where + S: Serializer; +} \ No newline at end of file diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index e7b8579d0..d9473f7a2 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -46,8 +46,8 @@ pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result(__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>, { @@ -55,6 +55,17 @@ pub fn expand_derive_deserialize(input: &mut syn::DeriveInput) -> syn::Result(__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, ¶ms); diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index 6eb3b0feb..d5ff606c2 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -32,8 +32,8 @@ pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result(__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, { @@ -41,6 +41,17 @@ pub fn expand_derive_serialize(input: &mut syn::DeriveInput) -> syn::Result(__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! {