@@ -281,6 +281,87 @@ pub trait FromEnv: core::fmt::Debug + Sized + 'static {
281281 fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > ;
282282}
283283
284+ impl < T > FromEnv for Option < T >
285+ where
286+ T : FromEnv ,
287+ {
288+ type Error = T :: Error ;
289+
290+ fn inventory ( ) -> Vec < & ' static EnvItemInfo > {
291+ T :: inventory ( )
292+ }
293+
294+ fn check_inventory ( ) -> Result < ( ) , Vec < & ' static EnvItemInfo > > {
295+ T :: check_inventory ( )
296+ }
297+
298+ fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > {
299+ match T :: from_env ( ) {
300+ Ok ( v) => Ok ( Some ( v) ) ,
301+ Err ( FromEnvErr :: Empty ( _) ) | Err ( FromEnvErr :: EnvError ( _, _) ) => Ok ( None ) ,
302+ Err ( e) => Err ( e) ,
303+ }
304+ }
305+ }
306+
307+ impl < T > FromEnv for Box < T >
308+ where
309+ T : FromEnv ,
310+ {
311+ type Error = T :: Error ;
312+
313+ fn inventory ( ) -> Vec < & ' static EnvItemInfo > {
314+ T :: inventory ( )
315+ }
316+
317+ fn check_inventory ( ) -> Result < ( ) , Vec < & ' static EnvItemInfo > > {
318+ T :: check_inventory ( )
319+ }
320+
321+ fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > {
322+ T :: from_env ( ) . map ( Box :: new)
323+ }
324+ }
325+
326+ impl < T > FromEnv for std:: sync:: Arc < T >
327+ where
328+ T : FromEnv ,
329+ {
330+ type Error = T :: Error ;
331+
332+ fn inventory ( ) -> Vec < & ' static EnvItemInfo > {
333+ T :: inventory ( )
334+ }
335+
336+ fn check_inventory ( ) -> Result < ( ) , Vec < & ' static EnvItemInfo > > {
337+ T :: check_inventory ( )
338+ }
339+
340+ fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > {
341+ T :: from_env ( ) . map ( std:: sync:: Arc :: new)
342+ }
343+ }
344+
345+ impl < T , U > FromEnv for std:: borrow:: Cow < ' static , U >
346+ where
347+ T : FromEnv ,
348+ U : std:: borrow:: ToOwned < Owned = T > + core:: fmt:: Debug ,
349+ {
350+ type Error = T :: Error ;
351+
352+ fn inventory ( ) -> Vec < & ' static EnvItemInfo > {
353+ T :: inventory ( )
354+ }
355+
356+ fn check_inventory ( ) -> Result < ( ) , Vec < & ' static EnvItemInfo > > {
357+ T :: check_inventory ( )
358+ }
359+
360+ fn from_env ( ) -> Result < Self , FromEnvErr < Self :: Error > > {
361+ T :: from_env ( ) . map ( std:: borrow:: Cow :: Owned )
362+ }
363+ }
364+
284365/// Trait for loading primitives from the environment. These are simple types
285366/// that should correspond to a single environment variable. It has been
286367/// implemented for common integer types, [`String`], [`url::Url`],
@@ -405,6 +486,40 @@ where
405486 }
406487}
407488
489+ impl < T > FromEnvVar for Box < T >
490+ where
491+ T : FromEnvVar ,
492+ {
493+ type Error = T :: Error ;
494+
495+ fn from_env_var ( env_var : & str ) -> Result < Self , FromEnvErr < Self :: Error > > {
496+ T :: from_env_var ( env_var) . map ( Box :: new)
497+ }
498+ }
499+
500+ impl < T > FromEnvVar for std:: sync:: Arc < T >
501+ where
502+ T : FromEnvVar ,
503+ {
504+ type Error = T :: Error ;
505+
506+ fn from_env_var ( env_var : & str ) -> Result < Self , FromEnvErr < Self :: Error > > {
507+ T :: from_env_var ( env_var) . map ( std:: sync:: Arc :: new)
508+ }
509+ }
510+
511+ impl < T , U > FromEnvVar for std:: borrow:: Cow < ' static , U >
512+ where
513+ T : FromEnvVar ,
514+ U : std:: borrow:: ToOwned < Owned = T > + core:: fmt:: Debug ,
515+ {
516+ type Error = T :: Error ;
517+
518+ fn from_env_var ( env_var : & str ) -> Result < Self , FromEnvErr < Self :: Error > > {
519+ T :: from_env_var ( env_var) . map ( std:: borrow:: Cow :: Owned )
520+ }
521+ }
522+
408523impl FromEnvVar for String {
409524 type Error = std:: convert:: Infallible ;
410525
0 commit comments