@@ -989,11 +989,7 @@ impl GlobalContext {
989989
990990 /// Internal method for getting an environment variable as a list.
991991 /// If the key is a non-mergeable list and a value is found in the environment, existing values are cleared.
992- fn get_env_list (
993- & self ,
994- key : & ConfigKey ,
995- output : & mut Vec < ( String , Definition ) > ,
996- ) -> CargoResult < ( ) > {
992+ fn get_env_list ( & self , key : & ConfigKey , output : & mut Vec < ConfigValue > ) -> CargoResult < ( ) > {
997993 let Some ( env_val) = self . env . get_str ( key. as_env_key ( ) ) else {
998994 self . check_environment_key_case_mismatch ( key) ;
999995 return Ok ( ( ) ) ;
@@ -1018,16 +1014,16 @@ impl GlobalContext {
10181014 def. clone ( ) ,
10191015 )
10201016 } ) ?;
1021- output. push ( ( s. to_string ( ) , def. clone ( ) ) ) ;
1017+ output. push ( CV :: String ( s. to_string ( ) , def. clone ( ) ) )
10221018 }
10231019 } else {
10241020 output. extend (
10251021 env_val
10261022 . split_whitespace ( )
1027- . map ( |s| ( s. to_string ( ) , def. clone ( ) ) ) ,
1023+ . map ( |s| CV :: String ( s. to_string ( ) , def. clone ( ) ) ) ,
10281024 ) ;
10291025 }
1030- output. sort_by ( |a, b| a. 1 . cmp ( & b . 1 ) ) ;
1026+ output. sort_by ( |a, b| a. definition ( ) . cmp ( b . definition ( ) ) ) ;
10311027 Ok ( ( ) )
10321028 }
10331029
@@ -1386,7 +1382,16 @@ impl GlobalContext {
13861382 Some ( CV :: String ( s, def) ) => {
13871383 vec ! [ abs( s, def) ]
13881384 }
1389- Some ( CV :: List ( list, _def) ) => list. iter ( ) . map ( |( s, def) | abs ( s, def) ) . collect ( ) ,
1385+ Some ( CV :: List ( list, _def) ) => list
1386+ . iter ( )
1387+ . map ( |cv| match cv {
1388+ CV :: String ( s, def) => Ok ( abs ( s, def) ) ,
1389+ other => bail ! (
1390+ "`include` expected a string or list of strings, but found {} in list" ,
1391+ other. desc( )
1392+ ) ,
1393+ } )
1394+ . collect :: < CargoResult < Vec < _ > > > ( ) ?,
13901395 Some ( other) => bail ! (
13911396 "`include` expected a string or list, but found {} in `{}`" ,
13921397 other. desc( ) ,
@@ -1774,7 +1779,16 @@ impl GlobalContext {
17741779 let key = ConfigKey :: from_str ( "paths" ) ;
17751780 // paths overrides cannot be set via env config, so use get_cv here.
17761781 match self . get_cv ( & key) ? {
1777- Some ( CV :: List ( val, definition) ) => Ok ( Some ( Value { val, definition } ) ) ,
1782+ Some ( CV :: List ( val, definition) ) => {
1783+ let val = val
1784+ . into_iter ( )
1785+ . map ( |cv| match cv {
1786+ CV :: String ( s, def) => Ok ( ( s, def) ) ,
1787+ other => self . expected ( "string" , & key, & other) ,
1788+ } )
1789+ . collect :: < CargoResult < Vec < _ > > > ( ) ?;
1790+ Ok ( Some ( Value { val, definition } ) )
1791+ }
17781792 Some ( val) => self . expected ( "list" , & key, & val) ,
17791793 None => Ok ( None ) ,
17801794 }
@@ -2138,7 +2152,7 @@ enum KeyOrIdx {
21382152pub enum ConfigValue {
21392153 Integer ( i64 , Definition ) ,
21402154 String ( String , Definition ) ,
2141- List ( Vec < ( String , Definition ) > , Definition ) ,
2155+ List ( Vec < ConfigValue > , Definition ) ,
21422156 Table ( HashMap < String , ConfigValue > , Definition ) ,
21432157 Boolean ( bool , Definition ) ,
21442158}
@@ -2151,11 +2165,11 @@ impl fmt::Debug for ConfigValue {
21512165 CV :: String ( s, def) => write ! ( f, "{} (from {})" , s, def) ,
21522166 CV :: List ( list, def) => {
21532167 write ! ( f, "[" ) ?;
2154- for ( i, ( s , def ) ) in list. iter ( ) . enumerate ( ) {
2168+ for ( i, item ) in list. iter ( ) . enumerate ( ) {
21552169 if i > 0 {
21562170 write ! ( f, ", " ) ?;
21572171 }
2158- write ! ( f, "{} (from {})" , s , def ) ?;
2172+ write ! ( f, "{item:?}" ) ?;
21592173 }
21602174 write ! ( f, "] (from {})" , def)
21612175 }
@@ -2196,7 +2210,7 @@ impl ConfigValue {
21962210 val. into_iter ( )
21972211 . enumerate ( )
21982212 . map ( |( i, toml) | match toml {
2199- toml:: Value :: String ( val) => Ok ( ( val, def. clone ( ) ) ) ,
2213+ toml:: Value :: String ( val) => Ok ( CV :: String ( val, def. clone ( ) ) ) ,
22002214 v => {
22012215 path. push ( KeyOrIdx :: Idx ( i) ) ;
22022216 bail ! ( "expected string but found {} at index {i}" , v. type_str( ) )
@@ -2231,9 +2245,7 @@ impl ConfigValue {
22312245 CV :: Boolean ( s, _) => toml:: Value :: Boolean ( s) ,
22322246 CV :: String ( s, _) => toml:: Value :: String ( s) ,
22332247 CV :: Integer ( i, _) => toml:: Value :: Integer ( i) ,
2234- CV :: List ( l, _) => {
2235- toml:: Value :: Array ( l. into_iter ( ) . map ( |( s, _) | toml:: Value :: String ( s) ) . collect ( ) )
2236- }
2248+ CV :: List ( l, _) => toml:: Value :: Array ( l. into_iter ( ) . map ( |cv| cv. into_toml ( ) ) . collect ( ) ) ,
22372249 CV :: Table ( l, _) => {
22382250 toml:: Value :: Table ( l. into_iter ( ) . map ( |( k, v) | ( k, v. into_toml ( ) ) ) . collect ( ) )
22392251 }
@@ -2275,7 +2287,7 @@ impl ConfigValue {
22752287 mem:: swap ( new, old) ;
22762288 }
22772289 }
2278- old. sort_by ( |a, b| a. 1 . cmp ( & b . 1 ) ) ;
2290+ old. sort_by ( |a, b| a. definition ( ) . cmp ( b . definition ( ) ) ) ;
22792291 }
22802292 ( & mut CV :: Table ( ref mut old, _) , CV :: Table ( ref mut new, _) ) => {
22812293 for ( key, value) in mem:: take ( new) {
@@ -2344,9 +2356,15 @@ impl ConfigValue {
23442356 }
23452357 }
23462358
2347- pub fn list ( & self , key : & str ) -> CargoResult < & [ ( String , Definition ) ] > {
2359+ pub fn list ( & self , key : & str ) -> CargoResult < Vec < ( String , Definition ) > > {
23482360 match self {
2349- CV :: List ( list, _) => Ok ( list) ,
2361+ CV :: List ( list, _) => list
2362+ . iter ( )
2363+ . map ( |cv| match cv {
2364+ CV :: String ( s, def) => Ok ( ( s. clone ( ) , def. clone ( ) ) ) ,
2365+ _ => self . expected ( "string" , key) ,
2366+ } )
2367+ . collect :: < CargoResult < _ > > ( ) ,
23502368 _ => self . expected ( "list" , key) ,
23512369 }
23522370 }
0 commit comments