99 lines
2.7 KiB
Rust
99 lines
2.7 KiB
Rust
use flate2::write::GzEncoder;
|
|
use flate2::Compression;
|
|
use serde::{Deserialize, Serialize};
|
|
use std::fs::File;
|
|
use std::path::{Path, PathBuf};
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
|
pub struct Manifest {
|
|
pub symbol: String,
|
|
#[serde(default = "default_false")]
|
|
pub cache: bool,
|
|
pub description: String,
|
|
pub includes: Vec<Include>,
|
|
pub entrypoint: Entrypoint,
|
|
pub parameters: Vec<Parameter>,
|
|
}
|
|
|
|
impl Manifest {
|
|
/**
|
|
* Create an artifact from the given manifest
|
|
*/
|
|
pub fn create_artifact(&self, dir: &Path, output: &Path) -> Result<(), std::io::Error> {
|
|
let tar_gz = File::create(output)?;
|
|
let enc = GzEncoder::new(tar_gz, Compression::default());
|
|
let mut tar = tar::Builder::new(enc);
|
|
let mut manifest = File::open(dir.join(Path::new("manifest.yml")))?;
|
|
tar.append_file(format!("{}/manifest.yml", self.symbol), &mut manifest)?;
|
|
|
|
for include in self.includes.iter() {
|
|
let mut f = File::open(match include.name.starts_with("./") {
|
|
true => {
|
|
// Relative to dir
|
|
dir.join(&include.name)
|
|
}
|
|
false => {
|
|
// Relative to $PWD
|
|
Path::new(&include.name).to_path_buf()
|
|
}
|
|
})?;
|
|
|
|
let archive_path = format!(
|
|
"{}/{}",
|
|
self.symbol,
|
|
match include.flatten {
|
|
true => {
|
|
let p = Path::new(&include.name);
|
|
p.file_name().unwrap().to_str().unwrap()
|
|
}
|
|
false => &include.name,
|
|
}
|
|
);
|
|
tar.append_file(&archive_path, &mut f)
|
|
.expect(&format!("Failed to append file: {}", &archive_path));
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
|
pub struct Include {
|
|
name: String,
|
|
#[serde(default = "default_false")]
|
|
flatten: bool,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
|
pub struct Entrypoint {
|
|
pub path: PathBuf,
|
|
#[serde(default = "default_false")]
|
|
multiarch: bool,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
|
pub struct Parameter {
|
|
name: String,
|
|
required: bool,
|
|
#[serde(rename = "type")]
|
|
p_type: ParameterType,
|
|
description: String,
|
|
}
|
|
|
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
|
pub enum ParameterType {
|
|
#[serde(rename = "string")]
|
|
StringParameter,
|
|
#[serde(rename = "boolean")]
|
|
BoolParameter,
|
|
#[serde(rename = "block")]
|
|
BlockParameter,
|
|
}
|
|
|
|
/** Simple function for serde defaults */
|
|
fn default_false() -> bool {
|
|
false
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {}
|