#![deny(dead_code)]
use serde::*;
use std::collections::HashSet;
use std::io;
use std::path::PathBuf;
use std::process::{Command, Stdio};
pub(crate) type PackageId = String;
#[derive(Deserialize, Debug)]
pub(crate) struct Root {
pub workspace_root: PathBuf,
pub packages: Vec<PackageRef>,
pub workspace_members: HashSet<PackageId>,
}
#[derive(Deserialize, Debug)]
pub(crate) struct PackageRef {
pub id: PackageId,
pub targets: Vec<PackageTarget>,
}
#[derive(Deserialize, Debug)]
pub(crate) struct PackageTarget {
pub kind: Vec<String>, pub name: String,
}
impl Root {
pub fn get() -> io::Result<Self> {
let o = Command::new("cargo").args(&["metadata", "--all-features", "--format-version", "1"]).stderr(Stdio::inherit()).output()?;
match o.status.code() {
Some(0) => {},
Some(n) => return Err(io::Error::new(io::ErrorKind::BrokenPipe, format!("`cargo metadata` failed (exit code {})", n))),
None => return Err(io::Error::new(io::ErrorKind::BrokenPipe, "`cargo metadata` failed (signal)")),
}
let stdout = String::from_utf8(o.stdout).map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))?;
serde_json::from_str(&stdout).map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))
}
}