boatctl 0.1.2

CLI for Blueboat Cloud.
Documentation
use std::collections::HashMap;

use anyhow::Result;
use serde::Serialize;

use crate::config::{AppConfig, MysqlMetadata, PubsubMetadata};

#[derive(Serialize)]
pub struct AppMetadata {
  pub env: HashMap<String, String>,
  pub secrets: HashMap<String, String>,
  pub mysql: HashMap<String, MysqlMetadata>,
  pub pubsub: HashMap<String, PubsubMetadata>,
}

impl AppMetadata {
  pub fn from_config(config: &AppConfig) -> Self {
    Self {
      env: config
        .env
        .iter()
        .map(|(k, v)| (k.get_ref().clone(), v.clone()))
        .collect(),
      secrets: config
        .secrets
        .iter()
        .map(|(k, v)| (k.get_ref().clone(), v.clone()))
        .collect(),
      mysql: config
        .mysql
        .iter()
        .map(|(k, v)| (k.get_ref().clone(), v.clone()))
        .collect(),
      pubsub: config
        .pubsub
        .iter()
        .map(|(k, v)| (k.get_ref().clone(), v.unwrap_as_metadata().clone()))
        .collect(),
    }
  }
}

#[derive(Serialize)]
pub struct PackedAppMetadata {
  pub version: String,
  pub package: String,
  pub env: HashMap<String, String>,

  #[serde(default)]
  pub mysql: HashMap<String, MysqlMetadata>,

  #[serde(default)]
  pub pubsub: HashMap<String, PubsubMetadata>,
}

impl PackedAppMetadata {
  pub fn new(md: &AppMetadata, package_filename: &str) -> Result<Self> {
    let out = Self {
      version: "app".into(),
      package: package_filename.into(),
      env: md
        .env
        .iter()
        .chain(md.secrets.iter())
        .map(|x| (x.0.clone(), x.1.clone()))
        .collect(),
      mysql: md.mysql.clone(),
      pubsub: md.pubsub.clone(),
    };
    Ok(out)
  }
}