use std::{
collections::{HashMap, HashSet},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Manifest {
pub name: String,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub entrypoints: HashMap<String, Entrypoint>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entrypoint {
#[serde(rename = "crate")]
pub _crate: String,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub environment: HashMap<String, EnvironmentVariable>,
#[serde(default, skip_serializing_if = "HashSet::is_empty")]
pub resources: HashSet<Resource>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub lambda: Option<LambdaOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(tag = "type")]
pub enum Resource {
Database,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LambdaOptions {
memory: i32,
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
pub struct EnvironmentVariable {
#[serde(default, skip_serializing_if = "default")]
pub sealed: bool,
#[serde(default, skip_serializing_if = "default")]
pub optional: bool,
#[serde(default, skip_serializing_if = "default")]
pub default: Option<String>,
#[serde(default, skip_serializing_if = "default")]
pub regex: Option<String>,
}
fn default<T: Default + PartialEq>(t: &T) -> bool {
*t == Default::default()
}
pub fn export_manifest(target_dir: &PathBuf, manifest: &Manifest) {
let mut file = std::fs::File::create(target_dir.join("manifest.json")).unwrap();
serde_json::to_writer_pretty(&mut file, &manifest).unwrap();
}