cargo-extract 0.2.0

Cargo subcommand to extract information from Cargo.toml files
Documentation
use cargo_extract::ExtractResult;
use clap::{crate_version, Arg, Command};
use std::{fs, process};

fn main() {
    let access_pattern_arg = "access_pattern";
    let matches = Command::new("cargo")
        .bin_name("cargo")
        .version(crate_version!())
        .long_version(crate_version!())
        .about("Extracts information found in Cargo.toml")
        .subcommand_required(true)
        .subcommand(Command::new("extract").arg(Arg::new(access_pattern_arg).required(true)))
        .get_matches();

    let Some(("extract", matches)) = matches.subcommand() else {
        unreachable!()
    };

    let pattern = matches
        .get_one::<String>(access_pattern_arg)
        .expect("Argument required");

    let manifest = read_cargo_toml().expect("Failed to find Cargo.toml");
    let manifest = manifest
        .parse::<toml::Value>()
        .expect("Failed to parse Cargo.toml manifest");

    match cargo_extract::extract(pattern, manifest) {
        Ok(extracted) => println!("{extracted}"),
        Err(err) => {
            println!("{err}");
            process::exit(1);
        }
    }
}

pub fn read_cargo_toml() -> ExtractResult<String> {
    fs::read_to_string("Cargo.toml").map_err(|_| "Failed to open Cargo.toml".to_string())
}