pub fn root_features<'a>(
        &'a self,
        direction: DependencyDirection,
    ) -> impl Iterator<Item = FeatureMetadata<'g>> + 'a {
        let feature_graph = self.graph;
        self.core
            .roots(feature_graph.dep_graph(), feature_graph.sccs(), direction)
            .into_iter()
            .map(move |feature_ix| {
                feature_graph
                    .metadata_for_node(feature_graph.dep_graph()[feature_ix])
                    .expect("feature node should be known")
            })
    }
Returns the set of "root feature" metadatas in the specified direction.

* If direction is Forward, return the set of metadatas that do not have any dependencies
within the selected graph.
* If direction is Reverse, return the set of metadatas that do not have any dependents
within the selected graph.

## Cycles

If a root consists of a dependency cycle, all the packages in it will be returned in
non-dev order (when the direction is forward).
guppy/src/graph/feature/resolve.rs