@@ -1310,15 +1310,16 @@ fn replace_all<E>(
13101310}
13111311
13121312static TRUE_FALSE_REPLACEMENT_RE : LazyLock < Regex > = LazyLock :: new ( || {
1313- Regex :: new ( r"\$\{(\w+)\|([^|]+)\|([^}]+)}" ) . expect ( "Regex failed to compile" )
1313+ Regex :: new ( r"\$\{(\w+)(?::-([^|}]+))?\|([^|]+)\|([^}]+)}" )
1314+ . expect ( "Regex failed to compile" )
13141315} ) ;
13151316
13161317static VARIABLE_REPLACEMENT_RE : LazyLock < Regex > = LazyLock :: new ( || {
13171318 Regex :: new ( r"\$\{(\w+)(?::-([^}]+))?}" ) . expect ( "Regex failed to compile" )
13181319} ) ;
13191320
13201321/// Replace all `${KEY}` or `${KEY:-default}` placeholders in a string according to the mapping.
1321- /// Also handles `${KEY|True value|false value}` syntax.
1322+ /// Also handles `${KEY:-default |True value|false value}` syntax.
13221323fn process_replacements (
13231324 input : & str ,
13241325 replacement_map : & HashMap < String , String > ,
@@ -1333,13 +1334,14 @@ fn process_replacements_with_env(
13331334) -> Result < String > {
13341335 debug ! ( "processing replacements for line '{input}'" ) ;
13351336
1336- // handle ${VAR|true value|false value} syntax
1337+ // handle ${VAR:-default |true value|false value} syntax
13371338 let replacement = |caps : & regex:: Captures | -> Result < String > {
13381339 let key = & caps[ 1 ] ;
1339- let true_val = & caps[ 2 ] ;
1340- let false_val = & caps[ 3 ] ;
1340+ let default = caps. get ( 2 ) . map ( |m| m. as_str ( ) . to_string ( ) ) ;
1341+ let true_val = & caps[ 3 ] ;
1342+ let false_val = & caps[ 4 ] ;
13411343
1342- let value = lookup_replacement_value ( key, replacement_map, & get_env) ;
1344+ let value = lookup_replacement_value ( key, replacement_map, & get_env) . or ( default ) ;
13431345
13441346 match value {
13451347 Some ( v) if v. eq_ignore_ascii_case ( "true" ) => Ok ( true_val. to_string ( ) ) ,
@@ -1690,7 +1692,7 @@ mod tests {
16901692 let env = replacement_map ( & [ ( "USE_PARQUET" , "TrUe" ) ] ) ;
16911693
16921694 let actual = process_replacements_with_env (
1693- "load_${USE_PARQUET|parquet|csv}.sql" ,
1695+ "load_${USE_PARQUET:-false |parquet|csv}.sql" ,
16941696 & replacements,
16951697 |key| env. get ( key) . cloned ( ) ,
16961698 )
@@ -1705,7 +1707,7 @@ mod tests {
17051707 let env = replacement_map ( & [ ( "USE_PARQUET" , "false" ) ] ) ;
17061708
17071709 let actual = process_replacements_with_env (
1708- "load_${USE_PARQUET|parquet|csv}.sql" ,
1710+ "load_${USE_PARQUET:-true |parquet|csv}.sql" ,
17091711 & replacements,
17101712 |key| env. get ( key) . cloned ( ) ,
17111713 )
@@ -1719,7 +1721,7 @@ mod tests {
17191721 let replacements = replacement_map ( & [ ( "USE_PARQUET" , "true" ) ] ) ;
17201722
17211723 let actual = process_replacements_with_env (
1722- "load_${USE_PARQUET|parquet|csv}.sql" ,
1724+ "load_${USE_PARQUET:-false |parquet|csv}.sql" ,
17231725 & replacements,
17241726 |_| None ,
17251727 )
@@ -1734,7 +1736,7 @@ mod tests {
17341736 let env = replacement_map ( & [ ( "USE_PARQUET" , "true" ) ] ) ;
17351737
17361738 let actual = process_replacements_with_env (
1737- "load_${USE_PARQUET|parquet|csv}.sql" ,
1739+ "load_${USE_PARQUET:-true |parquet|csv}.sql" ,
17381740 & replacements,
17391741 |key| env. get ( key) . cloned ( ) ,
17401742 )
@@ -1744,7 +1746,35 @@ mod tests {
17441746 }
17451747
17461748 #[ test]
1747- fn process_replacements_reports_missing_true_false_env_variable ( ) {
1749+ fn process_replacements_uses_true_false_default_for_missing_true_value ( ) {
1750+ let replacements = HashMap :: new ( ) ;
1751+
1752+ let actual = process_replacements_with_env (
1753+ "load_${USE_PARQUET:-true|parquet|csv}.sql" ,
1754+ & replacements,
1755+ |_| None ,
1756+ )
1757+ . expect ( "replacement should succeed" ) ;
1758+
1759+ assert_eq ! ( actual, "load_parquet.sql" ) ;
1760+ }
1761+
1762+ #[ test]
1763+ fn process_replacements_uses_true_false_default_for_missing_false_value ( ) {
1764+ let replacements = HashMap :: new ( ) ;
1765+
1766+ let actual = process_replacements_with_env (
1767+ "load_${USE_PARQUET:-false|parquet|csv}.sql" ,
1768+ & replacements,
1769+ |_| None ,
1770+ )
1771+ . expect ( "replacement should succeed" ) ;
1772+
1773+ assert_eq ! ( actual, "load_csv.sql" ) ;
1774+ }
1775+
1776+ #[ test]
1777+ fn process_replacements_reports_missing_true_false_variable_without_default ( ) {
17481778 let replacements = HashMap :: new ( ) ;
17491779
17501780 let error = process_replacements_with_env (
@@ -1768,7 +1798,7 @@ mod tests {
17681798 let env = replacement_map ( & [ ( "USE_TYPED_PATH" , "true" ) ] ) ;
17691799
17701800 let actual = process_replacements_with_env (
1771- "${USE_TYPED_PATH|data.${FILE_TYPE}|data.csv}" ,
1801+ "${USE_TYPED_PATH:-false |data.${FILE_TYPE}|data.csv}" ,
17721802 & replacements,
17731803 |key| env. get ( key) . cloned ( ) ,
17741804 )
0 commit comments