1use crate::{attr, bound, fallback, private};
2use proc_macro2::{Span, TokenStream};
3use quote::quote;
4use syn::{
5 parse_quote, Data, DataEnum, DataStruct, DeriveInput, Error, Fields, FieldsNamed, Result,
6};
7
8pub fn derive(input: &DeriveInput) -> TokenStream {
9 match try_expand(input) {
10 Ok(expanded) => expanded,
11 Err(error) => fallback::de(input, error),
15 }
16}
17
18fn try_expand(input: &DeriveInput) -> Result<TokenStream> {
19 match &input.data {
20 Data::Struct(DataStruct {
21 fields: Fields::Named(fields),
22 ..
23 }) => derive_struct(input, fields),
24 Data::Enum(enumeration) => derive_enum(input, enumeration),
25 Data::Struct(_) => Err(Error::new(
26 Span::call_site(),
27 "currently only structs with named fields are supported",
28 )),
29 Data::Union(_) => Err(Error::new(
30 Span::call_site(),
31 "currently only structs and enums are supported by this derive",
32 )),
33 }
34}
35
36pub fn derive_struct(input: &DeriveInput, fields: &FieldsNamed) -> Result<TokenStream> {
37 let ident = &input.ident;
38 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
39
40 let fieldname = fields.named.iter().map(|f| &f.ident).collect::<Vec<_>>();
41 let fieldty = fields.named.iter().map(|f| &f.ty);
42 let fieldstr = fields
43 .named
44 .iter()
45 .map(attr::name_of_field)
46 .collect::<Result<Vec<_>>>()?;
47
48 let wrapper_generics = bound::with_lifetime_bound(&input.generics, "'__a");
49 let (wrapper_impl_generics, wrapper_ty_generics, _) = wrapper_generics.split_for_impl();
50 let bound = ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserialize");
_s
})parse_quote!(miniserde::Deserialize);
51 let bounded_where_clause = bound::where_clause_with_bound(&input.generics, bound);
52 let private2 = private;
53
54 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "deprecated");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"non_upper_case_globals");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "const");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_eq(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "repr");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "C");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "struct");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserialize");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&bounded_where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "begin");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "addr_of_mut");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "__out");
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "cast");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&bounded_where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Box");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Map");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Box");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__State");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "default");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "struct");
::quote::__private::push_ident(&mut _s, "__State");
::quote::ToTokens::to_tokens(&wrapper_impl_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut private2, i) = private2.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut fieldty, i) = fieldty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let private2 =
match private2.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let fieldty =
match fieldty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private2, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&fieldty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'__a");
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&wrapper_impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Map");
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "__State");
::quote::ToTokens::to_tokens(&wrapper_ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&bounded_where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "key");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__k");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "str");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "__k");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut fieldstr, i) = fieldstr.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut private2, i) = private2.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let fieldstr =
match fieldstr.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let private2 =
match private2.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&fieldstr, &mut _s);
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private2, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserialize");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "begin");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
_s
});
_s
});
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ignore");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "finish");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "take");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "ok_or");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
}
}
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut fieldname, i) = fieldname.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let fieldname =
match fieldname.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&fieldname, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
55 #[allow(deprecated, non_upper_case_globals)]
56 const _: () = {
57 #[repr(C)]
58 struct __Visitor #impl_generics #where_clause {
59 __out: miniserde::#private::Option<#ident #ty_generics>,
60 }
61
62 impl #impl_generics miniserde::Deserialize for #ident #ty_generics #bounded_where_clause {
63 fn begin(__out: &mut miniserde::#private::Option<Self>) -> &mut dyn miniserde::de::Visitor {
64 unsafe {
65 &mut *miniserde::#private::ptr::addr_of_mut!(*__out).cast::<__Visitor #ty_generics>()
66 }
67 }
68 }
69
70 impl #impl_generics miniserde::de::Visitor for __Visitor #ty_generics #bounded_where_clause {
71 fn map(&mut self) -> miniserde::Result<miniserde::#private::Box<dyn miniserde::de::Map + '_>> {
72 Ok(miniserde::#private::Box::new(__State {
73 #(
74 #fieldname: miniserde::Deserialize::default(),
75 )*
76 __out: &mut self.__out,
77 }))
78 }
79 }
80
81 struct __State #wrapper_impl_generics #where_clause {
82 #(
83 #fieldname: miniserde::#private2::Option<#fieldty>,
84 )*
85 __out: &'__a mut miniserde::#private::Option<#ident #ty_generics>,
86 }
87
88 impl #wrapper_impl_generics miniserde::de::Map for __State #wrapper_ty_generics #bounded_where_clause {
89 fn key(&mut self, __k: &miniserde::#private::str) -> miniserde::Result<&mut dyn miniserde::de::Visitor> {
90 match __k {
91 #(
92 #fieldstr => miniserde::#private2::Ok(miniserde::Deserialize::begin(&mut self.#fieldname)),
93 )*
94 _ => miniserde::#private::Ok(<dyn miniserde::de::Visitor>::ignore()),
95 }
96 }
97
98 fn finish(&mut self) -> miniserde::Result<()> {
99 #(
100 let #fieldname = self.#fieldname.take().ok_or(miniserde::Error)?;
101 )*
102 *self.__out = miniserde::#private::Some(#ident {
103 #(
104 #fieldname,
105 )*
106 });
107 miniserde::#private::Ok(())
108 }
109 }
110 };
111 })
112}
113
114pub fn derive_enum(input: &DeriveInput, enumeration: &DataEnum) -> Result<TokenStream> {
115 if input.generics.lt_token.is_some() || input.generics.where_clause.is_some() {
116 return Err(Error::new(
117 Span::call_site(),
118 "Enums with generics are not supported",
119 ));
120 }
121
122 let ident = &input.ident;
123
124 let var_idents = enumeration
125 .variants
126 .iter()
127 .map(|variant| match variant.fields {
128 Fields::Unit => Ok(&variant.ident),
129 _ => Err(Error::new_spanned(
130 variant,
131 "Invalid variant: only simple enum variants without fields are supported",
132 )),
133 })
134 .collect::<Result<Vec<_>>>()?;
135 let names = enumeration
136 .variants
137 .iter()
138 .map(attr::name_of_variant)
139 .collect::<Result<Vec<_>>>()?;
140
141 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "deprecated");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"non_upper_case_globals");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "const");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_eq(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "repr");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "C");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "struct");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Deserialize");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "begin");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "unsafe");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ptr");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "addr_of_mut");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "__out");
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "cast");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "de");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Visitor");
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_ident(&mut _s, "__Visitor");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "string");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "s");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "str");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "value");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "s");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut names, i) = names.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut ident, i) = ident.quote_into_iter();
let has_iter = has_iter | i;
#[allow(unused_mut)]
let (mut var_idents, i) = var_idents.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let names =
match names.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let ident =
match ident.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
let var_idents =
match var_idents.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&names, &mut _s);
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&var_idents, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
_s
});
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "__out");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "value");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "miniserde");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
142 #[allow(deprecated, non_upper_case_globals)]
143 const _: () = {
144 #[repr(C)]
145 struct __Visitor {
146 __out: miniserde::#private::Option<#ident>,
147 }
148
149 impl miniserde::Deserialize for #ident {
150 fn begin(__out: &mut miniserde::#private::Option<Self>) -> &mut dyn miniserde::de::Visitor {
151 unsafe {
152 &mut *miniserde::#private::ptr::addr_of_mut!(*__out).cast::<__Visitor>()
153 }
154 }
155 }
156
157 impl miniserde::de::Visitor for __Visitor {
158 fn string(&mut self, s: &miniserde::#private::str) -> miniserde::Result<()> {
159 let value = match s {
160 #( #names => #ident::#var_idents, )*
161 _ => return miniserde::#private::Err(miniserde::Error),
162 };
163 self.__out = miniserde::#private::Some(value);
164 miniserde::#private::Ok(())
165 }
166 }
167 };
168 })
169}