use std::{collections::HashMap, path::PathBuf};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct AutoschematicConfig {
#[serde(default)]
pub safety_active: Option<bool>,
pub prefixes: HashMap<String, Prefix>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Prefix {
pub connectors: Vec<Connector>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub resource_group: Option<String>,
#[serde(default)]
pub tasks: Vec<Task>,
#[serde(default)]
pub env: HashMap<String, String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Task {
pub name: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub env: HashMap<String, String>,
#[serde(default)]
pub read_secrets: Vec<String>,
}
#[derive(Debug, Default, Deserialize, Serialize, Clone, PartialEq)]
pub enum Protocol {
#[default]
Tarpc,
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(deny_unknown_fields)]
pub enum Spec {
Binary {
path: PathBuf,
#[serde(default)]
protocol: Protocol,
},
Cargo {
name: String,
#[serde(default)]
version: Option<String>,
#[serde(default)]
binary: Option<String>,
#[serde(default)]
git: Option<String>,
#[serde(default)]
features: Option<Vec<String>>,
#[serde(default)]
protocol: Protocol,
},
CargoLocal {
path: PathBuf,
#[serde(default)]
binary: Option<String>,
#[serde(default)]
features: Option<Vec<String>>,
#[serde(default)]
protocol: Protocol,
},
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Connector {
pub shortname: String,
pub spec: Spec,
#[serde(default)]
pub env: HashMap<String, String>,
#[serde(default)]
pub read_secrets: Vec<String>,
}
impl AutoschematicConfig {
pub fn resource_group_map(&self) -> HashMap<String, Vec<PathBuf>> {
let mut res = HashMap::new();
for (prefix_name, prefix) in &self.prefixes {
if let Some(resource_group) = &prefix.resource_group {
if !res.contains_key(resource_group) {
res.insert(resource_group.to_string(), Vec::new());
}
if let Some(prefixes) = res.get_mut(resource_group) {
prefixes.push(PathBuf::from(prefix_name));
}
}
}
res
}
}