@@ -68,6 +68,23 @@ impl Environment {
68
68
self . get_target_var ( target, "IMAGE" )
69
69
}
70
70
71
+ fn dockerfile ( & self , target : & Target ) -> Option < String > {
72
+ let res = self . get_values_for ( "DOCKERFILE" , target, |s| s. to_string ( ) ) ;
73
+ res. 0 . or ( res. 1 )
74
+ }
75
+
76
+ fn dockerfile_context ( & self , target : & Target ) -> Option < String > {
77
+ let res = self . get_values_for ( "DOCKERFILE_CONTEXT" , target, |s| s. to_string ( ) ) ;
78
+ res. 0 . or ( res. 1 )
79
+ }
80
+
81
+ fn pre_build ( & self , target : & Target ) -> Option < Vec < String > > {
82
+ let res = self . get_values_for ( "PRE_BUILD" , target, |v| {
83
+ v. split ( '\n' ) . map ( String :: from) . collect ( )
84
+ } ) ;
85
+ res. 0 . or ( res. 1 )
86
+ }
87
+
71
88
fn runner ( & self , target : & Target ) -> Option < String > {
72
89
self . get_target_var ( target, "RUNNER" )
73
90
}
@@ -178,16 +195,34 @@ impl Config {
178
195
fn vec_from_config (
179
196
& self ,
180
197
target : & Target ,
181
- env : impl Fn ( & Environment , & Target ) -> ( Option < Vec < String > > , Option < Vec < String > > ) ,
182
- config_build : impl for < ' a > Fn ( & ' a CrossToml ) -> Option < & ' a [ String ] > ,
183
- config_target : impl for < ' a > Fn ( & ' a CrossToml , & Target ) -> Option < & ' a [ String ] > ,
184
- ) -> Result < Vec < String > > {
198
+ env : impl for < ' a > Fn ( & ' a Environment , & Target ) -> ( Option < Vec < String > > , Option < Vec < String > > ) ,
199
+ config : impl for < ' a > Fn ( & ' a CrossToml , & Target ) -> ( Option < & ' a [ String ] > , Option < & ' a [ String ] > ) ,
200
+ sum : bool ,
201
+ ) -> Result < Option < Vec < String > > > {
185
202
let ( env_build, env_target) = env ( & self . env , target) ;
186
203
187
- let mut collected = self . sum_of_env_toml_values ( env_build, config_build) ?;
188
- collected. extend ( self . sum_of_env_toml_values ( env_target, |t| config_target ( t, target) ) ?) ;
204
+ if sum {
205
+ return self . sum_of_env_toml_values ( env_target, |t| config ( t, target) ) ;
206
+ } else if let Some ( env_target) = env_target {
207
+ return Ok ( Some ( env_target) ) ;
208
+ }
189
209
190
- Ok ( collected)
210
+ let ( build, target) = self
211
+ . toml
212
+ . as_ref ( )
213
+ . map ( |t| config ( t, target) )
214
+ . unwrap_or_default ( ) ;
215
+
216
+ // FIXME: let expression
217
+ if target. is_none ( ) && env_build. is_some ( ) {
218
+ return Ok ( env_build) ;
219
+ }
220
+
221
+ if target. is_none ( ) {
222
+ Ok ( build. map ( ToOwned :: to_owned) )
223
+ } else {
224
+ Ok ( target. map ( ToOwned :: to_owned) )
225
+ }
191
226
}
192
227
193
228
#[ cfg( test) ]
@@ -211,22 +246,17 @@ impl Config {
211
246
self . string_from_config ( target, Environment :: runner, CrossToml :: runner)
212
247
}
213
248
214
- pub fn env_passthrough ( & self , target : & Target ) -> Result < Vec < String > > {
249
+ pub fn env_passthrough ( & self , target : & Target ) -> Result < Option < Vec < String > > > {
215
250
self . vec_from_config (
216
251
target,
217
252
Environment :: passthrough,
218
- CrossToml :: env_passthrough_build ,
219
- CrossToml :: env_passthrough_target ,
253
+ CrossToml :: env_passthrough ,
254
+ true ,
220
255
)
221
256
}
222
257
223
- pub fn env_volumes ( & self , target : & Target ) -> Result < Vec < String > > {
224
- self . vec_from_config (
225
- target,
226
- Environment :: volumes,
227
- CrossToml :: env_volumes_build,
228
- CrossToml :: env_volumes_target,
229
- )
258
+ pub fn env_volumes ( & self , target : & Target ) -> Result < Option < Vec < String > > > {
259
+ self . vec_from_config ( target, Environment :: volumes, CrossToml :: env_volumes, false )
230
260
}
231
261
232
262
pub fn target ( & self , target_list : & TargetList ) -> Option < Target > {
@@ -238,19 +268,62 @@ impl Config {
238
268
. and_then ( |t| t. default_target ( target_list) )
239
269
}
240
270
271
+ pub fn dockerfile ( & self , target : & Target ) -> Result < Option < String > > {
272
+ self . string_from_config ( target, Environment :: dockerfile, CrossToml :: dockerfile)
273
+ }
274
+
275
+ pub fn dockerfile_context ( & self , target : & Target ) -> Result < Option < String > > {
276
+ self . string_from_config (
277
+ target,
278
+ Environment :: dockerfile_context,
279
+ CrossToml :: dockerfile_context,
280
+ )
281
+ }
282
+
283
+ pub fn dockerfile_build_args (
284
+ & self ,
285
+ target : & Target ,
286
+ ) -> Result < Option < HashMap < String , String > > > {
287
+ // This value does not support env variables
288
+ self . toml
289
+ . as_ref ( )
290
+ . map_or ( Ok ( None ) , |t| Ok ( t. dockerfile_build_args ( target) ) )
291
+ }
292
+
293
+ pub fn pre_build ( & self , target : & Target ) -> Result < Option < Vec < String > > > {
294
+ self . vec_from_config (
295
+ target,
296
+ |e, t| ( None , e. pre_build ( t) ) ,
297
+ CrossToml :: pre_build,
298
+ false ,
299
+ )
300
+ }
301
+
241
302
fn sum_of_env_toml_values < ' a > (
242
303
& ' a self ,
243
- env_values : Option < Vec < String > > ,
244
- toml_getter : impl FnOnce ( & ' a CrossToml ) -> Option < & ' a [ String ] > ,
245
- ) -> Result < Vec < String > > {
304
+ env_values : Option < impl AsRef < [ String ] > > ,
305
+ toml_getter : impl FnOnce ( & ' a CrossToml ) -> ( Option < & ' a [ String ] > , Option < & ' a [ String ] > ) ,
306
+ ) -> Result < Option < Vec < String > > > {
307
+ let mut defined = false ;
246
308
let mut collect = vec ! [ ] ;
247
- if let Some ( mut vars) = env_values {
248
- collect. append ( & mut vars) ;
249
- } else if let Some ( toml_values) = self . toml . as_ref ( ) . and_then ( toml_getter) {
250
- collect. extend ( toml_values. iter ( ) . cloned ( ) ) ;
309
+ if let Some ( vars) = env_values {
310
+ collect. extend ( vars. as_ref ( ) . iter ( ) . cloned ( ) ) ;
311
+ defined = true ;
312
+ } else if let Some ( ( build, target) ) = self . toml . as_ref ( ) . map ( toml_getter) {
313
+ if let Some ( build) = build {
314
+ collect. extend ( build. iter ( ) . cloned ( ) ) ;
315
+ defined = true ;
316
+ }
317
+ if let Some ( target) = target {
318
+ collect. extend ( target. iter ( ) . cloned ( ) ) ;
319
+ defined = true ;
320
+ }
321
+ }
322
+ if !defined {
323
+ Ok ( None )
324
+ } else {
325
+ Ok ( Some ( collect) )
251
326
}
252
-
253
- Ok ( collect)
254
327
}
255
328
}
256
329
@@ -389,7 +462,8 @@ mod tests {
389
462
let config = Config :: new_with ( Some ( toml ( TOML_BUILD_VOLUMES ) ?) , env) ;
390
463
let expected = vec ! [ "VOLUME1" . to_string( ) , "VOLUME2" . into( ) ] ;
391
464
392
- let result = config. env_volumes ( & target ( ) ) . unwrap ( ) ;
465
+ let result = config. env_volumes ( & target ( ) ) . unwrap ( ) . unwrap_or_default ( ) ;
466
+ dbg ! ( & result) ;
393
467
assert ! ( result. len( ) == 2 ) ;
394
468
assert ! ( result. contains( & expected[ 0 ] ) ) ;
395
469
assert ! ( result. contains( & expected[ 1 ] ) ) ;
@@ -404,7 +478,8 @@ mod tests {
404
478
let config = Config :: new_with ( Some ( toml ( TOML_BUILD_VOLUMES ) ?) , env) ;
405
479
let expected = vec ! [ "VOLUME3" . to_string( ) , "VOLUME4" . into( ) ] ;
406
480
407
- let result = config. env_volumes ( & target ( ) ) . unwrap ( ) ;
481
+ let result = config. env_volumes ( & target ( ) ) . unwrap ( ) . unwrap_or_default ( ) ;
482
+ dbg ! ( & result) ;
408
483
assert ! ( result. len( ) == 2 ) ;
409
484
assert ! ( result. contains( & expected[ 0 ] ) ) ;
410
485
assert ! ( result. contains( & expected[ 1 ] ) ) ;
0 commit comments