1
1
use std:: env;
2
2
use std:: env:: VarError ;
3
- use std:: fmt:: Debug ;
4
- use std:: str:: FromStr ;
5
-
6
- pub fn env < T > ( key : & str ) -> T
7
- where
8
- T : Debug + FromStr ,
9
- <T as FromStr >:: Err : Debug ,
10
- {
11
- get_env ( key)
12
- . unwrap_or_else ( |_| panic ! ( "env {} is not configured" , key) )
13
- . parse ( )
14
- . unwrap ( )
3
+
4
+ pub trait EnvVar < T > {
5
+ fn env ( key : & str ) -> T ;
6
+
7
+ fn env_or ( key : & str , default : T ) -> T ;
8
+ }
9
+
10
+ pub struct Env { }
11
+
12
+ impl Env {
13
+ fn get_env ( key : & str ) -> Result < String , VarError > {
14
+ env:: var ( key)
15
+ }
15
16
}
16
17
17
- pub fn env_with_default < T > ( key : & str , default : T ) -> T
18
- where
19
- T : Debug + FromStr ,
20
- <T as FromStr >:: Err : Debug ,
21
- {
22
- if let Ok ( var) = get_env ( key) {
23
- return var. parse ( ) . unwrap ( ) ;
18
+ impl EnvVar < String > for Env {
19
+ fn env ( key : & str ) -> String {
20
+ Self :: get_env ( key) . unwrap_or_else ( |_| panic ! ( "env {} is not configured" , key) )
24
21
}
25
22
26
- default
23
+ fn env_or ( key : & str , default : String ) -> String {
24
+ Self :: get_env ( key) . unwrap_or ( default)
25
+ }
27
26
}
28
27
29
- fn get_env ( key : & str ) -> Result < String , VarError > {
30
- env:: var ( key)
28
+ impl EnvVar < usize > for Env {
29
+ fn env ( key : & str ) -> usize {
30
+ <Self as EnvVar < String > >:: env ( key) . parse ( ) . unwrap ( )
31
+ }
32
+
33
+ fn env_or ( key : & str , default : usize ) -> usize {
34
+ match Self :: get_env ( key) {
35
+ Ok ( var) => var. parse ( ) . unwrap ( ) ,
36
+ Err ( _) => default,
37
+ }
38
+ }
39
+ }
40
+
41
+ impl EnvVar < u16 > for Env {
42
+ fn env ( key : & str ) -> u16 {
43
+ <Self as EnvVar < usize > >:: env ( key) as u16
44
+ }
45
+
46
+ fn env_or ( key : & str , default : u16 ) -> u16 {
47
+ <Self as EnvVar < usize > >:: env_or ( key, default as usize ) as u16
48
+ }
31
49
}
32
50
33
51
#[ cfg( test) ]
34
52
mod tests {
35
53
use temp_env:: { with_var, with_var_unset} ;
36
54
37
- use crate :: env:: { env , env_with_default } ;
55
+ use crate :: env:: { Env , EnvVar } ;
38
56
39
57
#[ test]
40
58
fn env_with_default_env_is_set ( ) {
41
59
with_var ( "TEST_STRING" , Some ( "FOO" ) , || {
42
- assert_eq ! ( "FOO" , env_with_default ( "TEST_STRING" , "BAR" . to_string( ) ) ) ;
60
+ assert_eq ! ( "FOO" , Env :: env_or ( "TEST_STRING" , "BAR" . to_string( ) ) ) ;
43
61
} ) ;
44
62
45
63
with_var ( "TEST_INT" , Some ( "123" ) , || {
46
- let var: i32 = env_with_default ( "TEST_INT" , 456 ) ;
64
+ let var: usize = Env :: env_or ( "TEST_INT" , 456 ) ;
47
65
assert_eq ! ( 123 , var) ;
48
66
} ) ;
49
67
}
50
68
51
69
#[ test]
52
70
fn env_with_default_env_is_not_set_then_pick_default ( ) {
53
- assert_eq ! ( "BAR" , env_with_default ( "TEST_STRING" , "BAR" . to_string( ) ) ) ;
71
+ assert_eq ! ( "BAR" , Env :: env_or ( "TEST_STRING" , "BAR" . to_string( ) ) ) ;
54
72
55
- let var: i32 = env_with_default ( "TEST_INT" , 456 ) ;
73
+ let var: usize = Env :: env_or ( "TEST_INT" , 456 ) ;
56
74
assert_eq ! ( 456 , var) ;
57
75
}
58
76
59
77
#[ test]
60
78
fn env_when_env_is_set ( ) {
61
79
with_var ( "TEST_STRING" , Some ( "FOO" ) , || {
62
- let var: String = env ( "TEST_STRING" ) ;
80
+ let var: String = Env :: env ( "TEST_STRING" ) ;
63
81
64
82
assert_eq ! ( String :: from( "FOO" ) , var) ;
65
83
} ) ;
66
84
67
85
with_var ( "TEST_INT" , Some ( "132" ) , || {
68
- let var: i32 = env ( "TEST_INT" ) ;
86
+ let var: usize = Env :: env ( "TEST_INT" ) ;
69
87
70
88
assert_eq ! ( 132 , var) ;
71
89
} ) ;
@@ -75,15 +93,15 @@ mod tests {
75
93
#[ should_panic( expected = "env TEST_STRING is not configured" ) ]
76
94
fn env_without_string_env ( ) {
77
95
with_var_unset ( "TEST_STRING" , || {
78
- let _: String = env ( "TEST_STRING" ) ;
96
+ let _: String = Env :: env ( "TEST_STRING" ) ;
79
97
} )
80
98
}
81
99
82
100
#[ test]
83
101
#[ should_panic( expected = "env TEST_INT is not configured" ) ]
84
102
fn env_without_int_env ( ) {
85
103
with_var_unset ( "TEST_INT" , || {
86
- let _: u32 = env ( "TEST_INT" ) ;
104
+ let _: usize = Env :: env ( "TEST_INT" ) ;
87
105
} )
88
106
}
89
107
}
0 commit comments