@@ -102,15 +102,23 @@ impl Input {
102102 }
103103 }
104104
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+
106110 let error_name = format ! ( "{}EnvError" , self . ident) ;
107- syn:: parse_str :: < syn:: Ident > ( & error_name)
111+ syn:: parse_str :: < syn:: Path > ( & error_name)
108112 . map_err ( |_| {
109113 syn:: Error :: new ( self . ident . span ( ) , "Failed to parse error ident" ) . to_compile_error ( )
110114 } )
111115 . unwrap ( )
112116 }
113117
118+ fn is_infallible ( & self ) -> bool {
119+ self . error_variants ( ) . is_empty ( )
120+ }
121+
114122 fn error_variants ( & self ) -> Vec < TokenStream > {
115123 self . fields
116124 . iter ( )
@@ -152,6 +160,10 @@ impl Input {
152160 let error_variant_displays = self . error_variant_displays ( ) ;
153161 let error_variant_sources = self . expand_variant_sources ( ) ;
154162
163+ if error_variants. is_empty ( ) {
164+ return Default :: default ( ) ;
165+ }
166+
155167 quote ! {
156168 #[ doc = "Generated error type for [`FromEnv`] for" ]
157169 #[ doc = #struct_name_str]
@@ -195,6 +207,7 @@ impl Input {
195207 fn expand_impl ( & self ) -> TokenStream {
196208 let env_item_info = self . env_item_info ( ) ;
197209 let struct_name = & self . ident ;
210+
198211 let error_ident = self . error_ident ( ) ;
199212
200213 let item_from_envs = self . item_from_envs ( ) ;
@@ -226,16 +239,25 @@ impl Input {
226239
227240 fn expand_mod ( & self ) -> TokenStream {
228241 // let expanded_impl = expand_impl(input);
229- let expanded_error = self . expand_error ( ) ;
230242 let expanded_impl = self . expand_impl ( ) ;
231243 let crate_name = & self . crate_name ;
232- let error_ident = self . error_ident ( ) ;
233244
234245 let mod_ident =
235246 syn:: parse_str :: < syn:: Ident > ( & format ! ( "__from_env_impls_{}" , self . ident) ) . unwrap ( ) ;
236247
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+
237259 quote ! {
238- pub use #mod_ident :: #error_ident ;
260+ #use_err
239261 mod #mod_ident {
240262 use super :: * ;
241263 use #crate_name:: utils:: from_env:: { FromEnv , FromEnvErr , FromEnvVar , EnvItemInfo } ;
0 commit comments