cargo-features-manager 0.12.0

A tui tool to enable/disable & prune dependency features
use crate::io::parsing::dependency::parse_dependency_from_item;
use crate::io::util::toml_document_from_path;
use crate::project::dependency::Dependency;
use crate::project::package::Package;
use cargo_metadata::PackageId;
use color_eyre::Result;
use color_eyre::eyre::eyre;
use console::Emoji;
use std::collections::HashMap;

pub fn parse_workspace(
    path: &str,
    packages: &HashMap<PackageId, cargo_metadata::Package>,
) -> Result<Option<Package>> {
    let path = format!("{}/Cargo.toml", path);

    let document = toml_document_from_path(&path)?;
    let Some(workspace) = document.get("workspace") else {
        return Ok(None);
    };

    let Some(dependencies) = workspace.get("dependencies") else {
        return Ok(None);
    };

    let dependencies_table = dependencies.as_table_like().ok_or(eyre!(
        "failed to parse workspace.dependencies - not a table"
    ))?;

    let dependencies: Result<Vec<Dependency>> = dependencies_table
        .iter()
        .map(|(name, data)| parse_dependency_from_item(packages, name, data))
        .collect();

    let package = Package {
        dependencies: dependencies?,
        name: format!("{} Workspace", Emoji("🗃️", "")).to_string(),
        manifest_path: path,
    };

    Ok(Some(package))
}