use crate::Artifact;
use anyhow::{anyhow, Result};
use cargo_metadata::{CargoOpt, Message, MetadataCommand};
use cargo_toml::Manifest;
use gear_wasm_builder::optimize::OptType;
use serde::{Deserialize, Serialize};
use std::{
io::BufReader,
ops::Deref,
path::PathBuf,
process::{Command, Stdio},
};
pub struct Metadata {
inner: cargo_metadata::Metadata,
pub gbuild: GbuildMetadata,
pub manifest: PathBuf,
pub workspace: bool,
}
impl Metadata {
pub fn parse(workspace: bool, manifest: PathBuf, features: Vec<String>) -> Result<Self> {
let mut command = MetadataCommand::new();
command.features(CargoOpt::SomeFeatures(features));
command.manifest_path(&manifest);
let inner = command.exec()?;
let gbuild = serde_json::from_value::<MetadataField>(inner.workspace_metadata.clone())
.map(|mut m| {
m.gbuild.programs.dedup();
m.gbuild.metas.dedup();
m.gbuild
})
.unwrap_or_default();
Ok(Self {
inner,
workspace,
gbuild,
manifest,
})
}
}
impl Deref for Metadata {
type Target = cargo_metadata::Metadata;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct MetadataField {
pub gbuild: GbuildMetadata,
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct GbuildMetadata {
pub programs: Vec<String>,
pub metas: Vec<String>,
}