@@ -170,42 +170,144 @@ mod field_env {
170170mod field_env_prefix {
171171 use super :: * ;
172172
173- #[ test]
174- fn accepts_string ( ) {
175- let container = Container :: from ( parse_quote ! {
176- #[ derive( Config ) ]
177- struct Example {
178- #[ setting( env_prefix = "KEY" , nested) ]
179- a: String ,
180- }
181- } ) ;
182- let field = container. inner . get_fields ( ) [ 0 ] ;
173+ mod named_struct {
174+ use super :: * ;
183175
184- assert_eq ! ( field. args. env_prefix. as_ref( ) . unwrap( ) , "KEY" ) ;
185- }
176+ #[ test]
177+ fn accepts_string ( ) {
178+ let container = Container :: from ( parse_quote ! {
179+ #[ derive( Config ) ]
180+ #[ config( env_prefix = "PRE_" ) ]
181+ struct Example {
182+ #[ setting( env = "A" ) ]
183+ a: String ,
184+ #[ setting( env_prefix = "OVERRIDE_" , nested) ]
185+ b: NestedConfig ,
186+ }
187+ } ) ;
188+ let fields = container. inner . get_fields ( ) ;
186189
187- #[ test]
188- #[ should_panic( expected = "Attribute `env_prefix` cannot be empty." ) ]
189- fn errors_if_empty ( ) {
190- Container :: from ( parse_quote ! {
191- #[ derive( Config ) ]
192- struct Example {
193- #[ setting( env_prefix = "" , nested) ]
194- a: String ,
195- }
196- } ) ;
190+ assert_eq ! ( fields[ 0 ] . args. env. as_ref( ) . unwrap( ) , "A" ) ;
191+ assert ! ( fields[ 0 ] . args. env_prefix. is_none( ) ) ;
192+
193+ assert ! ( fields[ 1 ] . args. env. is_none( ) ) ;
194+ assert_eq ! ( fields[ 1 ] . args. env_prefix. as_ref( ) . unwrap( ) , "OVERRIDE_" ) ;
195+ }
196+
197+ #[ test]
198+ #[ should_panic( expected = "Attribute `env_prefix` cannot be empty." ) ]
199+ fn errors_if_empty ( ) {
200+ Container :: from ( parse_quote ! {
201+ #[ derive( Config ) ]
202+ struct Example {
203+ #[ setting( env_prefix = "" , nested) ]
204+ a: String ,
205+ }
206+ } )
207+ . impl_partial_env_values ( ) ;
208+ }
209+
210+ #[ test]
211+ #[ should_panic( expected = "Cannot use `env_prefix` without `nested`." ) ]
212+ fn errors_if_not_nested ( ) {
213+ Container :: from ( parse_quote ! {
214+ #[ derive( Config ) ]
215+ struct Example {
216+ #[ setting( env_prefix = "KEY" ) ]
217+ a: String ,
218+ }
219+ } )
220+ . impl_partial_env_values ( ) ;
221+ }
222+
223+ #[ test]
224+ fn supports_nested ( ) {
225+ let container = Container :: from ( parse_quote ! {
226+ #[ derive( Config ) ]
227+ struct Example {
228+ #[ setting( nested) ]
229+ a: NestedConfig ,
230+ #[ setting( nested = CustomConfig ) ]
231+ b: CustomConfig ,
232+ #[ setting( nested, env_prefix = "PRE_" ) ]
233+ c: NestedConfig ,
234+ #[ setting( nested = CustomConfig , env_prefix = "PRE_" ) ]
235+ d: CustomConfig ,
236+ }
237+ } ) ;
238+
239+ assert_snapshot ! ( pretty( container. impl_partial_env_values( ) ) ) ;
240+ }
197241 }
198242
199- #[ test]
200- #[ should_panic( expected = "Cannot use `env_prefix` without `nested`." ) ]
201- fn errors_if_not_nested ( ) {
202- Container :: from ( parse_quote ! {
203- #[ derive( Config ) ]
204- struct Example {
205- #[ setting( env_prefix = "KEY" ) ]
206- a: String ,
207- }
208- } ) ;
243+ mod unnamed_struct {
244+ use super :: * ;
245+
246+ #[ test]
247+ fn accepts_string ( ) {
248+ let container = Container :: from ( parse_quote ! {
249+ #[ derive( Config ) ]
250+ #[ config( env_prefix = "PRE_" ) ]
251+ struct Example (
252+ #[ setting( env = "A" ) ]
253+ String ,
254+ #[ setting( env_prefix = "OVERRIDE_" , nested) ]
255+ NestedConfig ,
256+ ) ;
257+ } ) ;
258+ let fields = container. inner . get_fields ( ) ;
259+
260+ assert_eq ! ( fields[ 0 ] . args. env. as_ref( ) . unwrap( ) , "A" ) ;
261+ assert ! ( fields[ 0 ] . args. env_prefix. is_none( ) ) ;
262+
263+ assert ! ( fields[ 1 ] . args. env. is_none( ) ) ;
264+ assert_eq ! ( fields[ 1 ] . args. env_prefix. as_ref( ) . unwrap( ) , "OVERRIDE_" ) ;
265+ }
266+
267+ #[ test]
268+ #[ should_panic( expected = "Attribute `env_prefix` cannot be empty." ) ]
269+ fn errors_if_empty ( ) {
270+ Container :: from ( parse_quote ! {
271+ #[ derive( Config ) ]
272+ struct Example (
273+ #[ setting( env_prefix = "" , nested) ]
274+ String ,
275+ ) ;
276+ } )
277+ . impl_partial_env_values ( ) ;
278+ }
279+
280+ #[ test]
281+ #[ should_panic( expected = "Cannot use `env_prefix` without `nested`." ) ]
282+ fn errors_if_not_nested ( ) {
283+ Container :: from ( parse_quote ! {
284+ #[ derive( Config ) ]
285+ struct Example (
286+ #[ setting( env_prefix = "KEY" ) ]
287+ String ,
288+ ) ;
289+ } )
290+ . impl_partial_env_values ( ) ;
291+ }
292+
293+ #[ test]
294+ fn supports_nested ( ) {
295+ let container = Container :: from ( parse_quote ! {
296+ #[ derive( Config ) ]
297+ struct Example (
298+ #[ setting( nested) ]
299+ NestedConfig ,
300+ #[ setting( nested = CustomConfig ) ]
301+ CustomConfig ,
302+ #[ setting( nested, env_prefix = "PRE_" ) ]
303+ NestedConfig ,
304+ #[ setting( nested = CustomConfig , env_prefix = "PRE_" ) ]
305+ CustomConfig ,
306+ ) ;
307+ } ) ;
308+
309+ assert_snapshot ! ( pretty( container. impl_partial_env_values( ) ) ) ;
310+ }
209311 }
210312}
211313
0 commit comments