(
input: &str,
replacement_map: &HashMap<String, String>,
get_env: impl Fn(&str) -> Option<String>,
)
| 1357 | } |
| 1358 | |
| 1359 | fn process_replacements_with_env( |
| 1360 | input: &str, |
| 1361 | replacement_map: &HashMap<String, String>, |
| 1362 | get_env: impl Fn(&str) -> Option<String>, |
| 1363 | ) -> Result<String> { |
| 1364 | debug!("processing replacements for line '{input}'"); |
| 1365 | |
| 1366 | // handle ${VAR:-default|true value|false value} syntax |
| 1367 | let replacement = |caps: ®ex::Captures| -> Result<String> { |
| 1368 | let key = &caps[1]; |
| 1369 | let default = caps.get(2).map(|m| m.as_str().to_string()); |
| 1370 | let true_val = &caps[3]; |
| 1371 | let false_val = &caps[4]; |
| 1372 | |
| 1373 | let value = lookup_replacement_value(key, replacement_map, &get_env).or(default); |
| 1374 | |
| 1375 | match value { |
| 1376 | Some(v) if v.eq_ignore_ascii_case("true") => Ok(true_val.to_string()), |
| 1377 | Some(_) => Ok(false_val.to_string()), |
| 1378 | None => Err(exec_datafusion_err!("Missing value for key '{key}'")), |
| 1379 | } |
| 1380 | }; |
| 1381 | let input = replace_all(&TRUE_FALSE_REPLACEMENT_RE, input, replacement)?; |
| 1382 | |
| 1383 | // handle ${KEY} and ${KEY:-default}` |
| 1384 | let replacement = |caps: ®ex::Captures| -> Result<String> { |
| 1385 | let key = &caps[1]; |
| 1386 | let default = caps.get(2); |
| 1387 | |
| 1388 | if let Some(v) = lookup_replacement_value(key, replacement_map, &get_env) { |
| 1389 | return Ok(v.to_string()); |
| 1390 | } |
| 1391 | |
| 1392 | // use default if it was set |
| 1393 | if let Some(def) = default { |
| 1394 | Ok(def.as_str().to_string()) |
| 1395 | } else { |
| 1396 | Err(exec_datafusion_err!("Missing value for key '{key}'")) |
| 1397 | } |
| 1398 | }; |
| 1399 | |
| 1400 | replace_all(&VARIABLE_REPLACEMENT_RE, &input, replacement) |
| 1401 | } |
| 1402 | |
| 1403 | fn lookup_replacement_value( |
| 1404 | key: &str, |
searching dependent graphs…