bular 0.0.2

CLI for managing Bular deployments
use std::{
    collections::{HashMap, HashSet},
    path::PathBuf,
};

use serde::{Deserialize, Serialize};

/// The manifest defines the entrypoints and resources for this application.
#[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 {
    /// The amount of memory available to the function at runtime. Increasing the function memory also increases its CPU allocation. The default value is 128 MB. The value can be any multiple of 1 MB.
    memory: i32,
    // TODO: Finish this
    // arn: String,
    // version_arn: String,
}

#[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();
}