#[ allow( clippy ::std_instead_of_alloc, clippy ::std_instead_of_core ) ]
mod private
{
use crate :: *;
use std ::fmt;
use collection_tools ::collection :: { BTreeMap, HashMap };
use former ::Former;
use error ::untyped ::Context;
use std ::result ::Result :: { self, Ok };
#[ derive( Debug, Former ) ]
pub struct FeaturesOptions
{
crate_dir: CrateDir,
with_features_deps: bool,
}
#[ derive( Debug, Default ) ]
pub struct FeaturesReport
{
pub with_features_deps: bool,
pub inner: HashMap< String, BTreeMap< String, Vec< String > > >,
}
impl fmt ::Display for FeaturesReport
{
#[ allow( clippy ::match_bool ) ]
fn fmt( &self, f: &mut fmt ::Formatter< '_ > ) -> Result< (), fmt ::Error >
{
self.inner.iter().try_for_each
( | ( package, features ) |
{
writeln!( f, "Package {package} : " )?;
features.iter().try_for_each
( | ( feature, dependencies ) |
{
let feature = if self.with_features_deps
{
let deps = dependencies.join( ", " );
format!( "\t{feature} : [{deps}]" )
}
else
{ format!( "\t{feature}" ) };
writeln!( f, "{feature}" )
}
)
}
)
}
}
pub fn features( FeaturesOptions { crate_dir, with_features_deps } : FeaturesOptions )
-> error ::untyped ::Result< FeaturesReport >
{
let workspace = Workspace ::try_from( crate_dir.clone() ).context( "Failed to find workspace" )?;
let packages = workspace.packages().filter
(
| package |
{
if let Ok( manifest_file ) = package.manifest_file()
{
manifest_file.inner().starts_with( crate_dir.clone().absolute_path() )
}
else
{
false
}
} );
let mut report = FeaturesReport
{
with_features_deps,
..Default ::default()
};
packages
.for_each
(
| package |
{
let features = package.features();
report.inner.insert( package.name().to_owned(), features.to_owned() );
}
);
error ::untyped ::Result ::Ok( report )
}
}
crate ::mod_interface!
{
orphan use features;
orphan use FeaturesOptions;
orphan use FeaturesReport;
}