@@ -94,7 +94,7 @@ use std::{
94
94
time:: SystemTime ,
95
95
} ;
96
96
97
- use toml_edit:: { DocumentMut , Item , Table , TomlError } ;
97
+ use toml_edit:: { DocumentMut , Item , TableLike , TomlError } ;
98
98
99
99
/// Error type used by this crate.
100
100
pub enum Error {
@@ -308,6 +308,7 @@ fn extract_workspace_dependencies(
308
308
) -> Result < BTreeMap < String , String > , Error > {
309
309
Ok ( workspace_dep_tables ( & workspace_toml)
310
310
. into_iter ( )
311
+ . map ( |t| t. iter ( ) )
311
312
. flatten ( )
312
313
. map ( move |( dep_name, dep_value) | {
313
314
let pkg_name = dep_value. get ( "package" ) . and_then ( |i| i. as_str ( ) ) . unwrap_or ( dep_name) ;
@@ -318,10 +319,10 @@ fn extract_workspace_dependencies(
318
319
}
319
320
320
321
/// Return an iterator over all `[workspace.dependencies]`
321
- fn workspace_dep_tables ( cargo_toml : & DocumentMut ) -> Option < & Table > {
322
+ fn workspace_dep_tables ( cargo_toml : & DocumentMut ) -> Option < & dyn TableLike > {
322
323
cargo_toml
323
324
. get ( "workspace" )
324
- . and_then ( |w| w. as_table ( ) ?. get ( "dependencies" ) ?. as_table ( ) )
325
+ . and_then ( |w| w. as_table_like ( ) ?. get ( "dependencies" ) ?. as_table_like ( ) )
325
326
}
326
327
327
328
/// Make sure that the given crate name is a valid rust identifier.
@@ -354,27 +355,29 @@ fn extract_crate_names(
354
355
( name. to_string ( ) , cr)
355
356
} ) ;
356
357
357
- let dep_tables = dep_tables ( cargo_toml) . chain ( target_dep_tables ( cargo_toml) ) ;
358
- let dep_pkgs = dep_tables. flatten ( ) . filter_map ( move |( dep_name, dep_value) | {
359
- let pkg_name = dep_value. get ( "package" ) . and_then ( |i| i. as_str ( ) ) . unwrap_or ( dep_name) ;
358
+ let dep_tables = dep_tables ( cargo_toml. as_table ( ) ) . chain ( target_dep_tables ( cargo_toml) ) ;
359
+ let dep_pkgs =
360
+ dep_tables. map ( |t| t. iter ( ) ) . flatten ( ) . filter_map ( move |( dep_name, dep_value) | {
361
+ let pkg_name = dep_value. get ( "package" ) . and_then ( |i| i. as_str ( ) ) . unwrap_or ( dep_name) ;
360
362
361
- // We already handle this via `root_pkg` above.
362
- if package_name. as_ref ( ) . map_or ( false , |n| * n == pkg_name) {
363
- return None
364
- }
363
+ // We already handle this via `root_pkg` above.
364
+ if package_name. as_ref ( ) . map_or ( false , |n| * n == pkg_name) {
365
+ return None
366
+ }
365
367
366
- // Check if this is a workspace dependency.
367
- let workspace = dep_value. get ( "workspace" ) . and_then ( |w| w. as_bool ( ) ) . unwrap_or_default ( ) ;
368
+ // Check if this is a workspace dependency.
369
+ let workspace =
370
+ dep_value. get ( "workspace" ) . and_then ( |w| w. as_bool ( ) ) . unwrap_or_default ( ) ;
368
371
369
- let pkg_name = workspace
370
- . then ( || workspace_dependencies. get ( pkg_name) . map ( |p| p. as_ref ( ) ) )
371
- . flatten ( )
372
- . unwrap_or ( pkg_name) ;
372
+ let pkg_name = workspace
373
+ . then ( || workspace_dependencies. get ( pkg_name) . map ( |p| p. as_ref ( ) ) )
374
+ . flatten ( )
375
+ . unwrap_or ( pkg_name) ;
373
376
374
- let cr = FoundCrate :: Name ( sanitize_crate_name ( dep_name) ) ;
377
+ let cr = FoundCrate :: Name ( sanitize_crate_name ( dep_name) ) ;
375
378
376
- Some ( ( pkg_name. to_owned ( ) , cr) )
377
- } ) ;
379
+ Some ( ( pkg_name. to_owned ( ) , cr) )
380
+ } ) ;
378
381
379
382
Ok ( root_pkg. into_iter ( ) . chain ( dep_pkgs) . collect ( ) )
380
383
}
@@ -383,18 +386,25 @@ fn extract_package_name(cargo_toml: &DocumentMut) -> Option<&str> {
383
386
cargo_toml. get ( "package" ) ?. get ( "name" ) ?. as_str ( )
384
387
}
385
388
386
- fn target_dep_tables ( cargo_toml : & DocumentMut ) -> impl Iterator < Item = & Table > {
387
- cargo_toml. get ( "target" ) . into_iter ( ) . filter_map ( Item :: as_table) . flat_map ( |t| {
388
- t. iter ( ) . map ( |( _, value) | value) . filter_map ( Item :: as_table) . flat_map ( dep_tables)
389
- } )
389
+ fn target_dep_tables ( cargo_toml : & DocumentMut ) -> impl Iterator < Item = & dyn TableLike > {
390
+ cargo_toml
391
+ . get ( "target" )
392
+ . into_iter ( )
393
+ . filter_map ( Item :: as_table_like)
394
+ . flat_map ( |t| {
395
+ t. iter ( )
396
+ . map ( |( _, value) | value)
397
+ . filter_map ( Item :: as_table_like)
398
+ . flat_map ( dep_tables)
399
+ } )
390
400
}
391
401
392
- fn dep_tables ( table : & Table ) -> impl Iterator < Item = & Table > {
402
+ fn dep_tables ( table : & dyn TableLike ) -> impl Iterator < Item = & dyn TableLike > {
393
403
table
394
404
. get ( "dependencies" )
395
405
. into_iter ( )
396
406
. chain ( table. get ( "dev-dependencies" ) )
397
- . filter_map ( Item :: as_table )
407
+ . filter_map ( Item :: as_table_like )
398
408
}
399
409
400
410
#[ cfg( test) ]
@@ -438,6 +448,16 @@ mod tests {
438
448
Ok ( Some ( FoundCrate :: Name ( name) ) ) if name == "my_crate"
439
449
}
440
450
451
+ // forbidding toml_edit::Item::as_table ought to mean this is OK, but let's have a test too
452
+ create_test ! {
453
+ deps_with_crate_inline_table,
454
+ r#"
455
+ dependencies = { my_crate = "0.1" }
456
+ "# ,
457
+ "" ,
458
+ Ok ( Some ( FoundCrate :: Name ( name) ) ) if name == "my_crate"
459
+ }
460
+
441
461
create_test ! {
442
462
dev_deps_with_crate,
443
463
r#"
0 commit comments