use failure::format_err;
use proc_macro2::TokenStream;
use serde::Deserializer;
use serde::Serializer;
pub(crate) mod syn {
use super::*;
use serde::de::*;
pub(crate) fn serialize<S: Serializer, T: ::syn::parse::Parse + quote::ToTokens>(
x: &T,
s: S,
) -> Result<S::Ok, S::Error> {
let mut tokens = TokenStream::new();
x.to_tokens(&mut tokens);
s.serialize_str(&tokens.to_string())
}
pub(crate) fn deserialize<
'de,
D: Deserializer<'de>,
T: ::syn::parse::Parse + quote::ToTokens,
>(
d: D,
) -> Result<T, D::Error> {
let as_str = String::deserialize::<D>(d)?;
let deserialized: T = ::syn::parse_str(&as_str).map_err(D::Error::custom)?;
Ok(deserialized)
}
}
pub(crate) mod token_stream {
use super::*;
use serde::de::*;
use std::str::FromStr;
pub(crate) fn serialize<S: Serializer>(x: &TokenStream, s: S) -> Result<S::Ok, S::Error> {
s.serialize_str(&x.to_string())
}
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<TokenStream, D::Error> {
let as_str = String::deserialize::<D>(d)?;
let tokens = TokenStream::from_str(&as_str)
.map_err(|e| D::Error::custom(format!("proc_macro2 LexError: {:?}", e)))?;
Ok(tokens)
}
}
pub(crate) mod pat_ident {
use super::*;
use serde::de::*;
pub(crate) fn serialize<S: Serializer>(x: &::syn::PatIdent, s: S) -> Result<S::Ok, S::Error> {
let pat: ::syn::Pat = x.clone().into();
super::syn::serialize(&pat, s)
}
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(
d: D,
) -> Result<::syn::PatIdent, D::Error> {
let pat = super::syn::deserialize(d)?;
match pat {
::syn::Pat::Ident(pat_ident) => Ok(pat_ident),
_ => Err(D::Error::custom(format_err!(
"WTF got back a non-ident pattern"
))),
}
}
}
pub(crate) mod span {
use super::*;
use proc_macro2::Span;
use serde::de::*;
#[allow(clippy::trivially_copy_pass_by_ref)] pub(crate) fn serialize<S: Serializer>(_x: &Span, s: S) -> Result<S::Ok, S::Error> {
s.serialize_unit()
}
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Span, D::Error> {
<()>::deserialize::<D>(d)?;
Ok(Span::call_site())
}
}
pub(crate) extern crate serde_str as string;