extern crate tuple_vec_map;
use crate::cache::{Artifact, Artifacts};
use crate::error::{Error, Result};
use serde::Deserialize;
use std::path::{Path, PathBuf};
#[derive(Debug)]
pub struct Manifest {
pub cache_root_dir: PathBuf,
pub artifacts: Artifacts,
pub disable_env_var: Option<String>,
}
#[derive(Deserialize)]
struct SerdeArtifact {
inputs: Vec<PathBuf>,
outputs: Vec<PathBuf>,
}
#[derive(Deserialize)]
struct SerdeManifest {
pub cache_root_dir: PathBuf,
#[serde(with = "tuple_vec_map")]
pub artifacts: Vec<(String, SerdeArtifact)>,
pub disable_env_var: Option<String>,
}
impl Manifest {
pub fn from_path(path: &Path) -> Result<Manifest> {
use std::fs::File;
let file = File::open(path)
.map_err(|cause| Error::chain(format!("Cannot open manifest {:?}!", path), cause))?;
let manifest = {
let serde_manifest: SerdeManifest = serde_yaml::from_reader(file).map_err(|cause| {
Error::chain(format!("Syntax error in manifest {:?}!", path), cause)
})?;
let mut manifest = Manifest {
cache_root_dir: serde_manifest.cache_root_dir,
artifacts: serde_manifest
.artifacts
.iter()
.map(|(name, serde_arti)| Artifact {
name: name.to_string(),
inputs: serde_arti.inputs.clone(),
outputs: serde_arti.outputs.clone(),
})
.collect(),
disable_env_var: serde_manifest.disable_env_var,
};
for artifact in &mut manifest.artifacts {
artifact.inputs.push(path.to_path_buf())
}
manifest
};
Ok(manifest)
}
}