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