@@ -102,15 +102,23 @@ impl Input {
102
102
}
103
103
}
104
104
105
- fn error_ident ( & self ) -> syn:: Ident {
105
+ fn error_ident ( & self ) -> syn:: Path {
106
+ if self . is_infallible ( ) {
107
+ return syn:: parse_str ( "::std::convert::Infallible" ) . unwrap ( ) ;
108
+ }
109
+
106
110
let error_name = format ! ( "{}EnvError" , self . ident) ;
107
- syn:: parse_str :: < syn:: Ident > ( & error_name)
111
+ syn:: parse_str :: < syn:: Path > ( & error_name)
108
112
. map_err ( |_| {
109
113
syn:: Error :: new ( self . ident . span ( ) , "Failed to parse error ident" ) . to_compile_error ( )
110
114
} )
111
115
. unwrap ( )
112
116
}
113
117
118
+ fn is_infallible ( & self ) -> bool {
119
+ self . error_variants ( ) . is_empty ( )
120
+ }
121
+
114
122
fn error_variants ( & self ) -> Vec < TokenStream > {
115
123
self . fields
116
124
. iter ( )
@@ -152,6 +160,10 @@ impl Input {
152
160
let error_variant_displays = self . error_variant_displays ( ) ;
153
161
let error_variant_sources = self . expand_variant_sources ( ) ;
154
162
163
+ if error_variants. is_empty ( ) {
164
+ return Default :: default ( ) ;
165
+ }
166
+
155
167
quote ! {
156
168
#[ doc = "Generated error type for [`FromEnv`] for" ]
157
169
#[ doc = #struct_name_str]
@@ -195,6 +207,7 @@ impl Input {
195
207
fn expand_impl ( & self ) -> TokenStream {
196
208
let env_item_info = self . env_item_info ( ) ;
197
209
let struct_name = & self . ident ;
210
+
198
211
let error_ident = self . error_ident ( ) ;
199
212
200
213
let item_from_envs = self . item_from_envs ( ) ;
@@ -226,16 +239,25 @@ impl Input {
226
239
227
240
fn expand_mod ( & self ) -> TokenStream {
228
241
// let expanded_impl = expand_impl(input);
229
- let expanded_error = self . expand_error ( ) ;
230
242
let expanded_impl = self . expand_impl ( ) ;
231
243
let crate_name = & self . crate_name ;
232
- let error_ident = self . error_ident ( ) ;
233
244
234
245
let mod_ident =
235
246
syn:: parse_str :: < syn:: Ident > ( & format ! ( "__from_env_impls_{}" , self . ident) ) . unwrap ( ) ;
236
247
248
+ let expanded_error = self . expand_error ( ) ;
249
+
250
+ let use_err = if !expanded_error. is_empty ( ) {
251
+ let error_ident = self . error_ident ( ) ;
252
+ quote ! {
253
+ pub use #mod_ident:: #error_ident;
254
+ }
255
+ } else {
256
+ quote ! { }
257
+ } ;
258
+
237
259
quote ! {
238
- pub use #mod_ident :: #error_ident ;
260
+ #use_err
239
261
mod #mod_ident {
240
262
use super :: * ;
241
263
use #crate_name:: utils:: from_env:: { FromEnv , FromEnvErr , FromEnvVar , EnvItemInfo } ;
0 commit comments