1use crate::ast::{Enum, Field, Input, Struct};
2use crate::attr::Trait;
3use crate::fallback;
4use crate::generics::InferredBounds;
5use crate::private;
6use crate::unraw::MemberUnraw;
7use proc_macro2::{Ident, Span, TokenStream};
8use quote::{format_ident, quote, quote_spanned, ToTokens};
9use std::collections::BTreeSet as Set;
10use syn::{DeriveInput, GenericArgument, PathArguments, Result, Token, Type};
11
12pub fn derive(input: &DeriveInput) -> TokenStream {
13 match try_expand(input) {
14 Ok(expanded) => expanded,
15 Err(error) => fallback::expand(input, error),
19 }
20}
21
22fn try_expand(input: &DeriveInput) -> Result<TokenStream> {
23 let input = Input::from_syn(input)?;
24 input.validate()?;
25 Ok(match input {
26 Input::Struct(input) => impl_struct(input),
27 Input::Enum(input) => impl_enum(input),
28 })
29}
30
31fn impl_struct(input: Struct) -> TokenStream {
32 let ty = call_site_ident(&input.ident);
33 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
34 let mut error_inferred_bounds = InferredBounds::new();
35
36 let source_body = if let Some(transparent_attr) = &input.attrs.transparent {
37 let only_field = &input.fields[0];
38 if only_field.contains_generic {
39 error_inferred_bounds.insert(only_field.ty, {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
_s
}quote!(::thiserror::#private::Error));
40 }
41 let member = &only_field.member;
42 Some({
let _span: ::quote::__private::Span =
::quote::__private::get_span(transparent_attr.span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "thiserror");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Error");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "self");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&member, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"as_dyn_error");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
_s
});
_s
}quote_spanned! {transparent_attr.span=>
43 ::thiserror::#private::Error::source(self.#member.as_dyn_error())
44 })
45 } else if let Some(source_field) = input.source_field() {
46 let source = &source_field.member;
47 if source_field.contains_generic {
48 let ty = unoptional_type(source_field.ty);
49 error_inferred_bounds.insert(ty, {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
_s
}quote!(::thiserror::#private::Error + 'static));
50 }
51 let asref = if type_is_option(source_field.ty) {
52 Some({
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "as_ref");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
::quote::__private::push_question_spanned(&mut _s, _span);
_s
}quote_spanned!(source.span()=> .as_ref()?))
53 } else {
54 None
55 };
56 let dyn_error = {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source_field.source_span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "self");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&source, &mut _s);
::quote::ToTokens::to_tokens(&asref, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "as_dyn_error");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
_s
}quote_spanned! {source_field.source_span()=>
57 self.#source #asref.as_dyn_error()
58 };
59 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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(&dyn_error, &mut _s);
_s
});
_s
}quote! {
60 ::core::option::Option::Some(#dyn_error)
61 })
62 } else {
63 None
64 };
65 let source_method = source_body.map(|body| {
66 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "source");
::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, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
_s
});
::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, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "AsDynError");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
}quote! {
67 fn source(&self) -> ::core::option::Option<&(dyn ::thiserror::#private::Error + 'static)> {
68 use ::thiserror::#private::AsDynError as _;
69 #body
70 }
71 }
72 });
73
74 let provide_method = input.backtrace_field().map(|backtrace_field| {
75 let request = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "request");
_s
}quote!(request);
76 let backtrace = &backtrace_field.member;
77 let body = if let Some(source_field) = input.source_field() {
78 let source = &source_field.member;
79 let source_provide = if type_is_option(source_field.ty) {
80 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "if");
::quote::__private::push_ident_spanned(&mut _s, _span, "let");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
_s
});
::quote::__private::push_eq_spanned(&mut _s, _span);
::quote::__private::push_and_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "self");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&source, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
});
_s
}quote_spanned! {source.span()=>
81 if let ::core::option::Option::Some(source) = &self.#source {
82 source.thiserror_provide(#request);
83 }
84 }
85 } else {
86 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "self");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&source, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
}quote_spanned! {source.span()=>
87 self.#source.thiserror_provide(#request);
88 }
89 };
90 let self_provide = if source == backtrace {
91 None
92 } else if type_is_option(backtrace_field.ty) {
93 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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, "backtrace");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&backtrace, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
94 if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
95 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
96 }
97 })
98 } else {
99 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::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, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&backtrace, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
100 #request.provide_ref::<::thiserror::#private::Backtrace>(&self.#backtrace);
101 })
102 };
103 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "ThiserrorProvide");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&source_provide, &mut _s);
::quote::ToTokens::to_tokens(&self_provide, &mut _s);
_s
}quote! {
104 use ::thiserror::#private::ThiserrorProvide as _;
105 #source_provide
106 #self_provide
107 }
108 } else if type_is_option(backtrace_field.ty) {
109 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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, "backtrace");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&backtrace, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
110 if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
111 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
112 }
113 }
114 } else {
115 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::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, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&backtrace, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
116 #request.provide_ref::<::thiserror::#private::Backtrace>(&self.#backtrace);
117 }
118 };
119 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "provide");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_request");
::quote::__private::push_gt(&mut _s);
::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_lifetime(&mut _s, "\'_request");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Request");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_request");
::quote::__private::push_gt(&mut _s);
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
}quote! {
120 fn provide<'_request>(&'_request self, #request: &mut ::core::error::Request<'_request>) {
121 #body
122 }
123 }
124 });
125
126 let mut display_implied_bounds = Set::new();
127 let display_body = if input.attrs.transparent.is_some() {
128 let only_field = &input.fields[0].member;
129 display_implied_bounds.insert((0, Trait::Display));
130 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Display");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::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, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&only_field, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__formatter");
_s
});
_s
}quote! {
131 ::core::fmt::Display::fmt(&self.#only_field, __formatter)
132 })
133 } else if let Some(display) = &input.attrs.display {
134 display_implied_bounds.clone_from(&display.implied_bounds);
135 let use_as_display = use_as_display(display.has_bonus_display);
136 let pat = fields_pat(&input.fields);
137 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&use_as_display, &mut _s);
::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, "unused_variables");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "deprecated");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "Self");
::quote::ToTokens::to_tokens(&pat, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&display, &mut _s);
_s
}quote! {
138 #use_as_display
139 #[allow(unused_variables, deprecated)]
140 let Self #pat = self;
141 #display
142 })
143 } else {
144 None
145 };
146 let display_impl = display_body.map(|body| {
147 let mut display_inferred_bounds = InferredBounds::new();
148 for (field, bound) in display_implied_bounds {
149 let field = &input.fields[field];
150 if field.contains_generic {
151 display_inferred_bounds.insert(field.ty, bound);
152 }
153 }
154 let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics);
155 {
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,
"unused_qualifications");
_s
});
_s
});
::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, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Display");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&display_where_clause, &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, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"used_underscore_binding");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "fmt");
::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, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__formatter");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Formatter");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
});
_s
}quote! {
156 #[allow(unused_qualifications)]
157 #[automatically_derived]
158 impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause {
159 #[allow(clippy::used_underscore_binding)]
160 fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
161 #body
162 }
163 }
164 }
165 });
166
167 let from_impl = input.from_field().map(|from_field| {
168 let span = from_field.attrs.from.unwrap().span;
169 let backtrace_field = input.distinct_backtrace_field();
170 let from = unoptional_type(from_field.ty);
171 let source_var = Ident::new("source", span);
172 let body = from_initializer(from_field, backtrace_field, &source_var);
173 let from_function = {
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, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"redundant_field_names");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "from");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&source_var, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&from, &mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
}quote! {
174 #[allow(clippy::redundant_field_names)]
175 fn from(#source_var: #from) -> Self {
176 #ty #body
177 }
178 };
179 let from_impl = {
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound_spanned(&mut _s, _span);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span,
"automatically_derived");
_s
});
::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "From");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&from, &mut _s);
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&from_function, &mut _s);
_s
});
_s
}quote_spanned! {span=>
180 #[automatically_derived]
181 impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
182 #from_function
183 }
184 };
185 let lint_allows = if input.generics.lifetimes().next().is_some() {
186 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "elidable_lifetime_names");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "needless_lifetimes");
::quote::__private::push_comma(&mut _s);
_s
}quote! {
187 clippy::elidable_lifetime_names,
188 clippy::needless_lifetimes,
189 })
190 } else {
191 None
192 };
193 Some({
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,
"unused_qualifications");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lint_allows, &mut _s);
_s
});
_s
});
::quote::ToTokens::to_tokens(&from_impl, &mut _s);
_s
}quote! {
194 #[allow(
195 deprecated,
196 unused_qualifications,
197 #lint_allows
198 )]
199 #from_impl
200 })
201 });
202
203 if input.generics.type_params().next().is_some() {
204 let self_token = <::syn::token::SelfTypeToken![Self]>::default();
205 error_inferred_bounds.insert(self_token, Trait::Debug);
206 error_inferred_bounds.insert(self_token, Trait::Display);
207 }
208 let error_where_clause = error_inferred_bounds.augment_where_clause(input.generics);
209
210 {
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,
"unused_qualifications");
_s
});
_s
});
::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, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&error_where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&source_method, &mut _s);
::quote::ToTokens::to_tokens(&provide_method, &mut _s);
_s
});
::quote::ToTokens::to_tokens(&display_impl, &mut _s);
::quote::ToTokens::to_tokens(&from_impl, &mut _s);
_s
}quote! {
211 #[allow(unused_qualifications)]
212 #[automatically_derived]
213 impl #impl_generics ::thiserror::#private::Error for #ty #ty_generics #error_where_clause {
214 #source_method
215 #provide_method
216 }
217 #display_impl
218 #from_impl
219 }
220}
221
222fn impl_enum(input: Enum) -> TokenStream {
223 let ty = call_site_ident(&input.ident);
224 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
225 let mut error_inferred_bounds = InferredBounds::new();
226
227 let source_method = if input.has_source() {
228 let arms = input.variants.iter().map(|variant| {
229 let ident = &variant.ident;
230 if let Some(transparent_attr) = &variant.attrs.transparent {
231 let only_field = &variant.fields[0];
232 if only_field.contains_generic {
233 error_inferred_bounds.insert(only_field.ty, {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
_s
}quote!(::thiserror::#private::Error));
234 }
235 let member = &only_field.member;
236 let source = {
let _span: ::quote::__private::Span =
::quote::__private::get_span(transparent_attr.span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "thiserror");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&private, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Error");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span,
"transparent");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"as_dyn_error");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
_s
});
_s
}quote_spanned! {transparent_attr.span=>
237 ::thiserror::#private::Error::source(transparent.as_dyn_error())
238 };
239 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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::ToTokens::to_tokens(&member, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "transparent");
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&source, &mut _s);
::quote::__private::push_comma(&mut _s);
_s
}quote! {
240 #ty::#ident {#member: transparent} => #source,
241 }
242 } else if let Some(source_field) = variant.source_field() {
243 let source = &source_field.member;
244 if source_field.contains_generic {
245 let ty = unoptional_type(source_field.ty);
246 error_inferred_bounds.insert(ty, {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
_s
}quote!(::thiserror::#private::Error + 'static));
247 }
248 let asref = if type_is_option(source_field.ty) {
249 Some({
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "as_ref");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
::quote::__private::push_question_spanned(&mut _s, _span);
_s
}quote_spanned!(source.span()=> .as_ref()?))
250 } else {
251 None
252 };
253 let varsource = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "source");
_s
}quote!(source);
254 let dyn_error = {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source_field.source_span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::ToTokens::to_tokens(&asref, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "as_dyn_error");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{ ::quote::__private::TokenStream::new() });
_s
}quote_spanned! {source_field.source_span()=>
255 #varsource #asref.as_dyn_error()
256 };
257 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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::ToTokens::to_tokens(&source, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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(&dyn_error, &mut _s);
_s
});
::quote::__private::push_comma(&mut _s);
_s
}quote! {
258 #ty::#ident {#source: #varsource, ..} => ::core::option::Option::Some(#dyn_error),
259 }
260 } else {
261 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "None");
::quote::__private::push_comma(&mut _s);
_s
}quote! {
262 #ty::#ident {..} => ::core::option::Option::None,
263 }
264 }
265 });
266 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "source");
::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, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dyn");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_add(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'static");
_s
});
::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, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "AsDynError");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
::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");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "self");
::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 arms, i) = arms.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arms =
match arms.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arms, &mut _s);
}
}
_s
});
_s
});
_s
}quote! {
267 fn source(&self) -> ::core::option::Option<&(dyn ::thiserror::#private::Error + 'static)> {
268 use ::thiserror::#private::AsDynError as _;
269 #[allow(deprecated)]
270 match self {
271 #(#arms)*
272 }
273 }
274 })
275 } else {
276 None
277 };
278
279 let provide_method = if input.has_backtrace() {
280 let request = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "request");
_s
}quote!(request);
281 let arms = input.variants.iter().map(|variant| {
282 let ident = &variant.ident;
283 match (variant.backtrace_field(), variant.source_field()) {
284 (Some(backtrace_field), Some(source_field))
285 if backtrace_field.attrs.backtrace.is_none() =>
286 {
287 let backtrace = &backtrace_field.member;
288 let source = &source_field.member;
289 let varsource = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "source");
_s
}quote!(source);
290 let source_provide = if type_is_option(source_field.ty) {
291 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "if");
::quote::__private::push_ident_spanned(&mut _s, _span, "let");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
_s
});
::quote::__private::push_eq_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
});
_s
}quote_spanned! {source.span()=>
292 if let ::core::option::Option::Some(source) = #varsource {
293 source.thiserror_provide(#request);
294 }
295 }
296 } else {
297 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(source.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
}quote_spanned! {source.span()=>
298 #varsource.thiserror_provide(#request);
299 }
300 };
301 let self_provide = if type_is_option(backtrace_field.ty) {
302 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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, "backtrace");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "backtrace");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
303 if let ::core::option::Option::Some(backtrace) = backtrace {
304 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
305 }
306 }
307 } else {
308 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
309 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
310 }
311 };
312 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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::ToTokens::to_tokens(&backtrace, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "backtrace");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&source, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&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, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "ThiserrorProvide");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&source_provide, &mut _s);
::quote::ToTokens::to_tokens(&self_provide, &mut _s);
_s
});
_s
}quote! {
313 #ty::#ident {
314 #backtrace: backtrace,
315 #source: #varsource,
316 ..
317 } => {
318 use ::thiserror::#private::ThiserrorProvide as _;
319 #source_provide
320 #self_provide
321 }
322 }
323 }
324 (Some(backtrace_field), Some(source_field))
325 if backtrace_field.member == source_field.member =>
326 {
327 let backtrace = &backtrace_field.member;
328 let varsource = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "source");
_s
}quote!(source);
329 let source_provide = if type_is_option(source_field.ty) {
330 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(backtrace.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "if");
::quote::__private::push_ident_spanned(&mut _s, _span, "let");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Some");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
_s
});
::quote::__private::push_eq_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span, "source");
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
});
_s
}quote_spanned! {backtrace.span()=>
331 if let ::core::option::Option::Some(source) = #varsource {
332 source.thiserror_provide(#request);
333 }
334 }
335 } else {
336 {
let _span: ::quote::__private::Span =
::quote::__private::get_span(backtrace.span()).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"thiserror_provide");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
}quote_spanned! {backtrace.span()=>
337 #varsource.thiserror_provide(#request);
338 }
339 };
340 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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::ToTokens::to_tokens(&backtrace, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&varsource, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&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, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "ThiserrorProvide");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&source_provide, &mut _s);
_s
});
_s
}quote! {
341 #ty::#ident {#backtrace: #varsource, ..} => {
342 use ::thiserror::#private::ThiserrorProvide as _;
343 #source_provide
344 }
345 }
346 }
347 (Some(backtrace_field), _) => {
348 let backtrace = &backtrace_field.member;
349 let body = if type_is_option(backtrace_field.ty) {
350 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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, "backtrace");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "backtrace");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
351 if let ::core::option::Option::Some(backtrace) = backtrace {
352 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
353 }
354 }
355 } else {
356 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "provide_ref");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "backtrace");
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
357 #request.provide_ref::<::thiserror::#private::Backtrace>(backtrace);
358 }
359 };
360 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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::ToTokens::to_tokens(&backtrace, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "backtrace");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
}quote! {
361 #ty::#ident {#backtrace: backtrace, ..} => {
362 #body
363 }
364 }
365 }
366 (None, _) => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::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_dot2(&mut _s);
_s
});
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote! {
367 #ty::#ident {..} => {}
368 },
369 }
370 });
371 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "provide");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_request");
::quote::__private::push_gt(&mut _s);
::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_lifetime(&mut _s, "\'_request");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&request, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Request");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'_request");
::quote::__private::push_gt(&mut _s);
_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, "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");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "self");
::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 arms, i) = arms.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arms =
match arms.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arms, &mut _s);
}
}
_s
});
_s
});
_s
}quote! {
372 fn provide<'_request>(&'_request self, #request: &mut ::core::error::Request<'_request>) {
373 #[allow(deprecated)]
374 match self {
375 #(#arms)*
376 }
377 }
378 })
379 } else {
380 None
381 };
382
383 let display_impl = if input.has_display() {
384 let mut display_inferred_bounds = InferredBounds::new();
385 let has_bonus_display = input.variants.iter().any(|v| {
386 v.attrs
387 .display
388 .as_ref()
389 .is_some_and(|display| display.has_bonus_display)
390 });
391 let use_as_display = use_as_display(has_bonus_display);
392 let void_deref = if input.variants.is_empty() {
393 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_star(&mut _s);
_s
}quote!(*))
394 } else {
395 None
396 };
397 let arms = input.variants.iter().map(|variant| {
398 let mut display_implied_bounds = Set::new();
399 let display = if let Some(display) = &variant.attrs.display {
400 display_implied_bounds.clone_from(&display.implied_bounds);
401 display.to_token_stream()
402 } else if let Some(fmt) = &variant.attrs.fmt {
403 let fmt_path = &fmt.path;
404 let vars = variant.fields.iter().map(|field| match &field.member {
405 MemberUnraw::Named(ident) => ident.to_local(),
406 MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("_{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
407 });
408 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&fmt_path, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut vars, i) = vars.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let vars =
match vars.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&vars, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_ident(&mut _s, "__formatter");
_s
});
_s
}quote!(#fmt_path(#(#vars,)* __formatter))
409 } else {
410 let only_field = match &variant.fields[0].member {
411 MemberUnraw::Named(ident) => ident.to_local(),
412 MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("_{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
413 };
414 display_implied_bounds.insert((0, Trait::Display));
415 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Display");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&only_field, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__formatter");
_s
});
_s
}quote!(::core::fmt::Display::fmt(#only_field, __formatter))
416 };
417 for (field, bound) in display_implied_bounds {
418 let field = &variant.fields[field];
419 if field.contains_generic {
420 display_inferred_bounds.insert(field.ty, bound);
421 }
422 }
423 let ident = &variant.ident;
424 let pat = fields_pat(&variant.fields);
425 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&ident, &mut _s);
::quote::ToTokens::to_tokens(&pat, &mut _s);
::quote::__private::push_fat_arrow(&mut _s);
::quote::ToTokens::to_tokens(&display, &mut _s);
_s
}quote! {
426 #ty::#ident #pat => #display
427 }
428 });
429 let arms = arms.collect::<Vec<_>>();
430 let display_where_clause = display_inferred_bounds.augment_where_clause(input.generics);
431 Some({
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,
"unused_qualifications");
_s
});
_s
});
::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, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Display");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&display_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, "fmt");
::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, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__formatter");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Formatter");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "fmt");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&use_as_display, &mut _s);
::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, "unused_variables");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "deprecated");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"used_underscore_binding");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "match");
::quote::ToTokens::to_tokens(&void_deref, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::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 arms, i) = arms.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let arms =
match arms.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&arms, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
_s
});
_s
}quote! {
432 #[allow(unused_qualifications)]
433 #[automatically_derived]
434 impl #impl_generics ::core::fmt::Display for #ty #ty_generics #display_where_clause {
435 fn fmt(&self, __formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
436 #use_as_display
437 #[allow(unused_variables, deprecated, clippy::used_underscore_binding)]
438 match #void_deref self {
439 #(#arms,)*
440 }
441 }
442 }
443 })
444 } else {
445 None
446 };
447
448 let from_impls = input.variants.iter().filter_map(|variant| {
449 let from_field = variant.from_field()?;
450 let span = from_field.attrs.from.unwrap().span;
451 let backtrace_field = variant.distinct_backtrace_field();
452 let variant = &variant.ident;
453 let from = unoptional_type(from_field.ty);
454 let source_var = Ident::new("source", span);
455 let body = from_initializer(from_field, backtrace_field, &source_var);
456 let from_function = {
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, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"redundant_field_names");
_s
});
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "from");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&source_var, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&from, &mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant, &mut _s);
::quote::ToTokens::to_tokens(&body, &mut _s);
_s
});
_s
}quote! {
457 #[allow(clippy::redundant_field_names)]
458 fn from(#source_var: #from) -> Self {
459 #ty::#variant #body
460 }
461 };
462 let from_impl = {
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound_spanned(&mut _s, _span);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident_spanned(&mut _s, _span,
"automatically_derived");
_s
});
::quote::__private::push_ident_spanned(&mut _s, _span, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "core");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "convert");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "From");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&from, &mut _s);
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&from_function, &mut _s);
_s
});
_s
}quote_spanned! {span=>
463 #[automatically_derived]
464 impl #impl_generics ::core::convert::From<#from> for #ty #ty_generics #where_clause {
465 #from_function
466 }
467 };
468 let lint_allows = if input.generics.lifetimes().next().is_some() {
469 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "elidable_lifetime_names");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "needless_lifetimes");
::quote::__private::push_comma(&mut _s);
_s
}quote! {
470 clippy::elidable_lifetime_names,
471 clippy::needless_lifetimes,
472 })
473 } else {
474 None
475 };
476 Some({
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,
"unused_qualifications");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lint_allows, &mut _s);
_s
});
_s
});
::quote::ToTokens::to_tokens(&from_impl, &mut _s);
_s
}quote! {
477 #[allow(
478 deprecated,
479 unused_qualifications,
480 #lint_allows
481 )]
482 #from_impl
483 })
484 });
485
486 if input.generics.type_params().next().is_some() {
487 let self_token = <::syn::token::SelfTypeToken![Self]>::default();
488 error_inferred_bounds.insert(self_token, Trait::Debug);
489 error_inferred_bounds.insert(self_token, Trait::Display);
490 }
491 let error_where_clause = error_inferred_bounds.augment_where_clause(input.generics);
492
493 {
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,
"unused_qualifications");
_s
});
_s
});
::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, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Error");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&error_where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&source_method, &mut _s);
::quote::ToTokens::to_tokens(&provide_method, &mut _s);
_s
});
::quote::ToTokens::to_tokens(&display_impl, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut from_impls, i) = from_impls.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let from_impls =
match from_impls.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&from_impls, &mut _s);
}
}
_s
}quote! {
494 #[allow(unused_qualifications)]
495 #[automatically_derived]
496 impl #impl_generics ::thiserror::#private::Error for #ty #ty_generics #error_where_clause {
497 #source_method
498 #provide_method
499 }
500 #display_impl
501 #(#from_impls)*
502 }
503}
504
505pub(crate) fn call_site_ident(ident: &Ident) -> Ident {
508 let mut ident = ident.clone();
509 ident.set_span(ident.span().resolved_at(Span::call_site()));
510 ident
511}
512
513fn fields_pat(fields: &[Field]) -> TokenStream {
514 let mut members = fields.iter().map(|field| &field.member).peekable();
515 match members.peek() {
516 Some(MemberUnraw::Named(_)) => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut members, i) = members.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let members =
match members.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&members, &mut _s);
}
}
_s
});
_s
}quote!({ #(#members),* }),
517 Some(MemberUnraw::Unnamed(_)) => {
518 let vars = members.map(|member| match member {
519 MemberUnraw::Unnamed(index) => match ::quote::__private::IdentFragmentAdapter(&index) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("_{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("_{}", index),
520 MemberUnraw::Named(_) => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
521 });
522 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut vars, i) = vars.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let vars =
match vars.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&vars, &mut _s);
}
}
_s
});
_s
}quote!((#(#vars),*))
523 }
524 None => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote!({}),
525 }
526}
527
528fn use_as_display(needs_as_display: bool) -> Option<TokenStream> {
529 if needs_as_display {
530 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "use");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "AsDisplay");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_semi(&mut _s);
_s
}quote! {
531 use ::thiserror::#private::AsDisplay as _;
532 })
533 } else {
534 None
535 }
536}
537
538fn from_initializer(
539 from_field: &Field,
540 backtrace_field: Option<&Field>,
541 source_var: &Ident,
542) -> TokenStream {
543 let from_member = &from_field.member;
544 let some_source = if type_is_option(from_field.ty) {
545 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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(&source_var, &mut _s);
_s
});
_s
}quote!(::core::option::Option::Some(#source_var))
546 } else {
547 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&source_var, &mut _s);
_s
}quote!(#source_var)
548 };
549 let backtrace = backtrace_field.map(|backtrace_field| {
550 let backtrace_member = &backtrace_field.member;
551 if type_is_option(backtrace_field.ty) {
552 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::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_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "capture");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_comma(&mut _s);
_s
}quote! {
553 #backtrace_member: ::core::option::Option::Some(::thiserror::#private::Backtrace::capture()),
554 }
555 } else {
556 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&backtrace_member, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "core");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "From");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "from");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "thiserror");
::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, "Backtrace");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "capture");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_comma(&mut _s);
_s
}quote! {
557 #backtrace_member: ::core::convert::From::from(::thiserror::#private::Backtrace::capture()),
558 }
559 }
560 });
561 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&from_member, &mut _s);
::quote::__private::push_colon(&mut _s);
::quote::ToTokens::to_tokens(&some_source, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&backtrace, &mut _s);
_s
});
_s
}quote!({
562 #from_member: #some_source,
563 #backtrace
564 })
565}
566
567fn type_is_option(ty: &Type) -> bool {
568 type_parameter_of_option(ty).is_some()
569}
570
571fn unoptional_type(ty: &Type) -> TokenStream {
572 let unoptional = type_parameter_of_option(ty).unwrap_or(ty);
573 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&unoptional, &mut _s);
_s
}quote!(#unoptional)
574}
575
576fn type_parameter_of_option(ty: &Type) -> Option<&Type> {
577 let path = match ty {
578 Type::Path(ty) => &ty.path,
579 _ => return None,
580 };
581
582 let last = path.segments.last().unwrap();
583 if last.ident != "Option" {
584 return None;
585 }
586
587 let bracketed = match &last.arguments {
588 PathArguments::AngleBracketed(bracketed) => bracketed,
589 _ => return None,
590 };
591
592 if bracketed.args.len() != 1 {
593 return None;
594 }
595
596 match &bracketed.args[0] {
597 GenericArgument::Type(arg) => Some(arg),
598 _ => None,
599 }
600}