diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index b7eab3ab..3e2ae61a 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -16,6 +16,7 @@ use bound; use fragment::{Expr, Fragment, Match, Stmts}; use internals::ast::{Container, Data, Field, Style, Variant}; use internals::{self, attr}; +use try; use std::collections::BTreeSet; @@ -63,10 +64,12 @@ pub fn expand_derive_deserialize(input: &syn::DeriveInput) -> Result TokenStream { diff --git a/serde_derive/src/ser.rs b/serde_derive/src/ser.rs index cf7db09b..992084f6 100644 --- a/serde_derive/src/ser.rs +++ b/serde_derive/src/ser.rs @@ -15,6 +15,7 @@ use bound; use fragment::{Fragment, Match, Stmts}; use internals::ast::{Container, Data, Field, Style, Variant}; use internals::{attr, Ctxt}; +use try; use std::u32; @@ -55,10 +56,12 @@ pub fn expand_derive_serialize(input: &syn::DeriveInput) -> Result Tokens { + // Cannot pass `$expr` to `quote!` prior to Rust 1.17.0 so interpolate it. + let dollar = Op::new('$', Spacing::Alone); + + quote! { + #[allow(unused_macros)] + macro_rules! try { + (#dollar __expr:expr) => { + match #dollar __expr { + _serde::export::Ok(__val) => __val, + _serde::export::Err(__err) => { + return _serde::export::Err(__err); + } + } + } + } + } +}