@@ -9,6 +9,37 @@ use std::collections::HashMap;
9
9
use std:: env;
10
10
use std:: str:: FromStr ;
11
11
12
+ #[ derive( Debug ) ]
13
+ pub struct ConfVal < T > {
14
+ pub build : Option < T > ,
15
+ pub target : Option < T > ,
16
+ }
17
+
18
+ impl < T > ConfVal < T > {
19
+ pub fn new ( build : Option < T > , target : Option < T > ) -> Self {
20
+ Self { build, target }
21
+ }
22
+
23
+ pub fn map < U , F : Fn ( T ) -> U > ( self , f : F ) -> ConfVal < U > {
24
+ ConfVal {
25
+ build : self . build . map ( & f) ,
26
+ target : self . target . map ( & f) ,
27
+ }
28
+ }
29
+ }
30
+
31
+ impl < T > Default for ConfVal < T > {
32
+ fn default ( ) -> Self {
33
+ Self :: new ( None , None )
34
+ }
35
+ }
36
+
37
+ impl < T : PartialEq > PartialEq < ( Option < T > , Option < T > ) > for ConfVal < T > {
38
+ fn eq ( & self , other : & ( Option < T > , Option < T > ) ) -> bool {
39
+ self . build == other. 0 && self . target == other. 1
40
+ }
41
+ }
42
+
12
43
#[ derive( Debug ) ]
13
44
struct Environment ( & ' static str , Option < HashMap < & ' static str , & ' static str > > ) ;
14
45
@@ -33,11 +64,11 @@ impl Environment {
33
64
var : & str ,
34
65
target : & Target ,
35
66
convert : impl Fn ( & str ) -> T ,
36
- ) -> ( Option < T > , Option < T > ) {
67
+ ) -> ConfVal < T > {
37
68
let build_values = self . get_build_var ( var) . map ( |ref s| convert ( s) ) ;
38
69
let target_values = self . get_target_var ( target, var) . map ( |ref s| convert ( s) ) ;
39
70
40
- ( build_values, target_values)
71
+ ConfVal :: new ( build_values, target_values)
41
72
}
42
73
43
74
fn target_path ( target : & Target , key : & str ) -> String {
@@ -60,11 +91,11 @@ impl Environment {
60
91
self . get_var ( & self . build_var_name ( & Self :: target_path ( target, key) ) )
61
92
}
62
93
63
- fn xargo ( & self , target : & Target ) -> ( Option < bool > , Option < bool > ) {
94
+ fn xargo ( & self , target : & Target ) -> ConfVal < bool > {
64
95
self . get_values_for ( "XARGO" , target, bool_from_envvar)
65
96
}
66
97
67
- fn build_std ( & self , target : & Target ) -> ( Option < BuildStd > , Option < BuildStd > ) {
98
+ fn build_std ( & self , target : & Target ) -> ConfVal < BuildStd > {
68
99
self . get_values_for ( "BUILD_STD" , target, |v| {
69
100
if let Some ( value) = try_bool_from_envvar ( v) {
70
101
BuildStd :: Bool ( value)
@@ -74,15 +105,15 @@ impl Environment {
74
105
} )
75
106
}
76
107
77
- fn zig ( & self , target : & Target ) -> ( Option < bool > , Option < bool > ) {
108
+ fn zig ( & self , target : & Target ) -> ConfVal < bool > {
78
109
self . get_values_for ( "ZIG" , target, bool_from_envvar)
79
110
}
80
111
81
- fn zig_version ( & self , target : & Target ) -> ( Option < String > , Option < String > ) {
112
+ fn zig_version ( & self , target : & Target ) -> ConfVal < String > {
82
113
self . get_values_for ( "ZIG_VERSION" , target, ToOwned :: to_owned)
83
114
}
84
115
85
- fn zig_image ( & self , target : & Target ) -> Result < ( Option < PossibleImage > , Option < PossibleImage > ) > {
116
+ fn zig_image ( & self , target : & Target ) -> Result < ConfVal < PossibleImage > > {
86
117
let get_build = |env : & Environment , var : & str | env. get_build_var ( var) ;
87
118
let get_target = |env : & Environment , var : & str | env. get_target_var ( target, var) ;
88
119
let env_build = get_possible_image (
@@ -100,23 +131,23 @@ impl Environment {
100
131
get_target,
101
132
) ?;
102
133
103
- Ok ( ( env_build, env_target) )
134
+ Ok ( ConfVal :: new ( env_build, env_target) )
104
135
}
105
136
106
137
fn image ( & self , target : & Target ) -> Result < Option < PossibleImage > > {
107
138
let get_target = |env : & Environment , var : & str | env. get_target_var ( target, var) ;
108
139
get_possible_image ( self , "IMAGE" , "IMAGE_TOOLCHAIN" , get_target, get_target)
109
140
}
110
141
111
- fn dockerfile ( & self , target : & Target ) -> ( Option < String > , Option < String > ) {
142
+ fn dockerfile ( & self , target : & Target ) -> ConfVal < String > {
112
143
self . get_values_for ( "DOCKERFILE" , target, ToOwned :: to_owned)
113
144
}
114
145
115
- fn dockerfile_context ( & self , target : & Target ) -> ( Option < String > , Option < String > ) {
146
+ fn dockerfile_context ( & self , target : & Target ) -> ConfVal < String > {
116
147
self . get_values_for ( "DOCKERFILE_CONTEXT" , target, ToOwned :: to_owned)
117
148
}
118
149
119
- fn pre_build ( & self , target : & Target ) -> ( Option < PreBuild > , Option < PreBuild > ) {
150
+ fn pre_build ( & self , target : & Target ) -> ConfVal < PreBuild > {
120
151
self . get_values_for ( "PRE_BUILD" , target, |v| {
121
152
let v: Vec < _ > = v. split ( '\n' ) . map ( String :: from) . collect ( ) ;
122
153
if v. len ( ) == 1 {
@@ -134,11 +165,11 @@ impl Environment {
134
165
self . get_target_var ( target, "RUNNER" )
135
166
}
136
167
137
- fn passthrough ( & self , target : & Target ) -> ( Option < Vec < String > > , Option < Vec < String > > ) {
168
+ fn passthrough ( & self , target : & Target ) -> ConfVal < Vec < String > > {
138
169
self . get_values_for ( "ENV_PASSTHROUGH" , target, split_to_cloned_by_ws)
139
170
}
140
171
141
- fn volumes ( & self , target : & Target ) -> ( Option < Vec < String > > , Option < Vec < String > > ) {
172
+ fn volumes ( & self , target : & Target ) -> ConfVal < Vec < String > > {
142
173
self . get_values_for ( "ENV_VOLUMES" , target, split_to_cloned_by_ws)
143
174
}
144
175
@@ -209,10 +240,6 @@ pub fn try_bool_from_envvar(envvar: &str) -> Option<bool> {
209
240
}
210
241
}
211
242
212
- fn map_opt_tuple < T , U , F : Fn ( T ) -> U > ( t : ( Option < T > , Option < T > ) , f : F ) -> ( Option < U > , Option < U > ) {
213
- ( t. 0 . map ( & f) , t. 1 . map ( & f) )
214
- }
215
-
216
243
#[ derive( Debug ) ]
217
244
pub struct Config {
218
245
toml : Option < CrossToml > ,
@@ -250,26 +277,26 @@ impl Config {
250
277
fn get_from_value_inner < T , U > (
251
278
& self ,
252
279
target : & Target ,
253
- env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ( Option < T > , Option < T > ) ,
254
- config : impl for < ' a > FnOnce ( & ' a CrossToml , & Target ) -> ( Option < Cow < ' a , U > > , Option < Cow < ' a , U > > ) ,
280
+ env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ConfVal < T > ,
281
+ config : impl for < ' a > FnOnce ( & ' a CrossToml , & Target ) -> ConfVal < Cow < ' a , U > > ,
255
282
) -> Option < T >
256
283
where
257
284
U : ToOwned < Owned = T > + ?Sized ,
258
285
{
259
- let ( env_build , env_target ) = env ( & self . env , target) ;
260
- let ( toml_build , toml_target ) = self
286
+ let env = env ( & self . env , target) ;
287
+ let toml = self
261
288
. toml
262
289
. as_ref ( )
263
290
. map ( |toml| config ( toml, target) )
264
291
. unwrap_or_default ( ) ;
265
292
266
- match ( env_target , toml_target ) {
293
+ match ( env . target , toml . target ) {
267
294
( Some ( value) , _) => return Some ( value) ,
268
295
( None , Some ( value) ) => return Some ( value. into_owned ( ) ) ,
269
296
( None , None ) => { }
270
297
}
271
298
272
- match ( env_build , toml_build ) {
299
+ match ( env . build , toml . build ) {
273
300
( Some ( value) , _) => return Some ( value) ,
274
301
( None , Some ( value) ) => return Some ( value. into_owned ( ) ) ,
275
302
( None , None ) => { }
@@ -281,19 +308,16 @@ impl Config {
281
308
fn vec_from_config (
282
309
& self ,
283
310
target : & Target ,
284
- env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ( Option < Vec < String > > , Option < Vec < String > > ) ,
285
- config : impl for < ' a > FnOnce (
286
- & ' a CrossToml ,
287
- & Target ,
288
- ) -> ( Option < & ' a [ String ] > , Option < & ' a [ String ] > ) ,
311
+ env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ConfVal < Vec < String > > ,
312
+ config : impl for < ' a > FnOnce ( & ' a CrossToml , & Target ) -> ConfVal < & ' a [ String ] > ,
289
313
sum : bool ,
290
314
) -> Option < Vec < String > > {
291
315
if sum {
292
- let ( mut env_build , env_target ) = env ( & self . env , target) ;
293
- if let ( Some ( b) , Some ( mut t) ) = ( & mut env_build , env_target ) {
294
- b. append ( & mut t) ;
316
+ let mut env = env ( & self . env , target) ;
317
+ if let ( Some ( b) , Some ( t) ) = ( & mut env . build , & mut env . target ) {
318
+ b. append ( t) ;
295
319
}
296
- self . sum_of_env_toml_values ( env_build , |t| config ( t, target) )
320
+ self . sum_of_env_toml_values ( env . build , |t| config ( t, target) )
297
321
} else {
298
322
self . get_from_ref ( target, env, config)
299
323
}
@@ -302,28 +326,28 @@ impl Config {
302
326
fn get_from_ref < T , U > (
303
327
& self ,
304
328
target : & Target ,
305
- env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ( Option < T > , Option < T > ) ,
306
- config : impl for < ' a > FnOnce ( & ' a CrossToml , & Target ) -> ( Option < & ' a U > , Option < & ' a U > ) ,
329
+ env : impl for < ' a > FnOnce ( & ' a Environment , & Target ) -> ConfVal < T > ,
330
+ config : impl for < ' a > FnOnce ( & ' a CrossToml , & Target ) -> ConfVal < & ' a U > ,
307
331
) -> Option < T >
308
332
where
309
333
U : ToOwned < Owned = T > + ?Sized ,
310
334
{
311
335
self . get_from_value_inner ( target, env, |toml, target| {
312
- map_opt_tuple ( config ( toml, target) , |v| Cow :: Borrowed ( v) )
336
+ config ( toml, target) . map ( |v| Cow :: Borrowed ( v) )
313
337
} )
314
338
}
315
339
316
340
fn get_from_value < T > (
317
341
& self ,
318
342
target : & Target ,
319
- env : impl FnOnce ( & Environment , & Target ) -> ( Option < T > , Option < T > ) ,
320
- config : impl FnOnce ( & CrossToml , & Target ) -> ( Option < T > , Option < T > ) ,
343
+ env : impl FnOnce ( & Environment , & Target ) -> ConfVal < T > ,
344
+ config : impl FnOnce ( & CrossToml , & Target ) -> ConfVal < T > ,
321
345
) -> Option < T >
322
346
where
323
347
T : ToOwned < Owned = T > ,
324
348
{
325
349
self . get_from_value_inner :: < T , T > ( target, env, |toml, target| {
326
- map_opt_tuple ( config ( toml, target) , |v| Cow :: Owned ( v) )
350
+ config ( toml, target) . map ( |v| Cow :: Owned ( v) )
327
351
} )
328
352
}
329
353
@@ -357,16 +381,16 @@ impl Config {
357
381
let env = self . env . image ( target) ?;
358
382
Ok ( self . get_from_ref (
359
383
target,
360
- |_, _| ( None , env) ,
361
- |toml, target| ( None , toml. image ( target) ) ,
384
+ |_, _| ConfVal :: new ( None , env) ,
385
+ |toml, target| ConfVal :: new ( None , toml. image ( target) ) ,
362
386
) )
363
387
}
364
388
365
389
pub fn runner ( & self , target : & Target ) -> Option < String > {
366
390
self . get_from_ref (
367
391
target,
368
- |env, target| ( None , env. runner ( target) ) ,
369
- |toml, target| ( None , toml. runner ( target) ) ,
392
+ |env, target| ConfVal :: new ( None , env. runner ( target) ) ,
393
+ |toml, target| ConfVal :: new ( None , toml. runner ( target) ) ,
370
394
)
371
395
}
372
396
@@ -435,19 +459,19 @@ impl Config {
435
459
fn sum_of_env_toml_values < ' a > (
436
460
& ' a self ,
437
461
env_values : Option < Vec < String > > ,
438
- toml_getter : impl FnOnce ( & ' a CrossToml ) -> ( Option < & ' a [ String ] > , Option < & ' a [ String ] > ) ,
462
+ toml_getter : impl FnOnce ( & ' a CrossToml ) -> ConfVal < & ' a [ String ] > ,
439
463
) -> Option < Vec < String > > {
440
464
let mut defined = false ;
441
465
let mut collect = vec ! [ ] ;
442
466
if env_values. is_some ( ) {
443
467
return env_values;
444
- } else if let Some ( ( build , target ) ) = self . toml . as_ref ( ) . map ( toml_getter) {
445
- if let Some ( build) = build {
468
+ } else if let Some ( toml ) = self . toml . as_ref ( ) . map ( toml_getter) {
469
+ if let Some ( build) = toml . build {
446
470
collect. extend ( build. iter ( ) . cloned ( ) ) ;
447
471
defined = true ;
448
472
}
449
473
450
- if let Some ( target) = target {
474
+ if let Some ( target) = toml . target {
451
475
collect. extend ( target. iter ( ) . cloned ( ) ) ;
452
476
defined = true ;
453
477
}
@@ -564,7 +588,7 @@ mod tests {
564
588
565
589
let env = Environment :: new ( Some ( map) ) ;
566
590
567
- let ( build, target) = env. passthrough ( & target ( ) ) ;
591
+ let ConfVal { build, target } = env. passthrough ( & target ( ) ) ;
568
592
assert ! ( build. as_ref( ) . unwrap( ) . contains( & "TEST1" . to_owned( ) ) ) ;
569
593
assert ! ( build. as_ref( ) . unwrap( ) . contains( & "TEST2" . to_owned( ) ) ) ;
570
594
assert ! ( target. as_ref( ) . unwrap( ) . contains( & "PASS1" . to_owned( ) ) ) ;
0 commit comments