pub fn make_feature_sets<'g>(
        &self,
        graph: &'g PackageGraph,
    ) -> Result<(FeatureSet<'g>, FeatureSet<'g>)> {
        let package_set = if self.packages.is_empty() {
            graph.resolve_workspace()
        } else {
            graph.resolve_workspace_names(self.packages.iter())?
        };
        let features_only_set = if self.features_only.is_empty() {
            graph.resolve_none()
        } else {
            graph.resolve_workspace_names(self.features_only.iter())?
        };

        let base_filter = match (self.all_features, self.no_default_features) {
            (true, _) => StandardFeatures::All,
            (false, false) => StandardFeatures::Default,
            (false, true) => StandardFeatures::None,
        };
        // TODO: support package/feature format
        // TODO: support feature name validation similar to cargo
        let mut feature_filter =
            named_feature_filter(base_filter, self.features.iter().map(|s| s.as_str()));

        Ok((
            package_set.to_feature_set(&mut feature_filter),
            features_only_set.to_feature_set(&mut feature_filter),
        ))
    }
Evaluates this struct against the given graph, and converts it into the initials and
features-only `FeatureSet`s.
guppy-cmdlib/src/lib.rs