@@ -1851,6 +1851,7 @@ impl TomlManifest {
1851
1851
}
1852
1852
}
1853
1853
let all = |_d : & TomlDependency | true ;
1854
+ let dependencies = map_deps ( config, self . dependencies . as_ref ( ) , all) ?;
1854
1855
return Ok ( TomlManifest {
1855
1856
package : Some ( package) ,
1856
1857
project : None ,
@@ -1860,7 +1861,7 @@ impl TomlManifest {
1860
1861
example : self . example . clone ( ) ,
1861
1862
test : self . test . clone ( ) ,
1862
1863
bench : self . bench . clone ( ) ,
1863
- dependencies : map_deps ( config , self . dependencies . as_ref ( ) , all ) ? ,
1864
+ dependencies : dependencies. clone ( ) ,
1864
1865
dev_dependencies : map_deps (
1865
1866
config,
1866
1867
self . dev_dependencies
@@ -1877,7 +1878,7 @@ impl TomlManifest {
1877
1878
all,
1878
1879
) ?,
1879
1880
build_dependencies2 : None ,
1880
- features : self . features . clone ( ) ,
1881
+ features : map_features ( dependencies , self . features . clone ( ) ) ,
1881
1882
target : match self . target . as_ref ( ) . map ( |target_map| {
1882
1883
target_map
1883
1884
. iter ( )
@@ -1919,6 +1920,45 @@ impl TomlManifest {
1919
1920
lints : self . lints . clone ( ) ,
1920
1921
} ) ;
1921
1922
1923
+ fn map_features (
1924
+ deps : Option < BTreeMap < String , MaybeWorkspaceDependency > > ,
1925
+ features : Option < BTreeMap < InternedString , Vec < InternedString > > > ,
1926
+ ) -> Option < BTreeMap < InternedString , Vec < InternedString > > > {
1927
+ let deps = deps?;
1928
+ let mut features = features. clone ( ) ?;
1929
+ features. iter_mut ( ) . for_each ( |( _name, features) | {
1930
+ features. retain ( |feature| {
1931
+ if !feature. contains ( '/' ) {
1932
+ return true ;
1933
+ }
1934
+ let mut iter = feature. split ( '/' ) ;
1935
+ let dep_name = iter. next ( ) . unwrap ( ) ;
1936
+ let feature_name = iter. next ( ) . unwrap ( ) ;
1937
+ for ( i_dep_name, i_dep_detail) in deps. iter ( ) {
1938
+ if i_dep_name == dep_name {
1939
+ return match i_dep_detail {
1940
+ MaybeWorkspace :: Defined ( defined) => match defined {
1941
+ TomlDependency :: Simple ( _) => false ,
1942
+ TomlDependency :: Detailed ( detail) => detail
1943
+ . features
1944
+ . as_ref ( )
1945
+ . map ( |v| v. contains ( & feature_name. to_string ( ) ) )
1946
+ . is_some_and ( |v| v) ,
1947
+ } ,
1948
+ MaybeWorkspace :: Workspace ( workspace) => workspace
1949
+ . features
1950
+ . as_ref ( )
1951
+ . map ( |v| v. contains ( & feature_name. to_string ( ) ) )
1952
+ . is_some_and ( |v| v) ,
1953
+ } ;
1954
+ }
1955
+ }
1956
+ false
1957
+ } )
1958
+ } ) ;
1959
+ Some ( features)
1960
+ }
1961
+
1922
1962
fn map_deps (
1923
1963
config : & Config ,
1924
1964
deps : Option < & BTreeMap < String , MaybeWorkspaceDependency > > ,
0 commit comments