use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize, Clone)]
pub struct Manifest {
#[serde(default)] pub globals: serde_json::Value,
#[serde(default)]
pub sockets: HashMap<String, SocketConfig>,
pub auth: Option<AuthConfig>,
pub connectors: HashMap<String, ConnectorConfig>,
pub components: HashMap<String, ComponentConfig>,
pub routes: HashMap<String, Route>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SocketConfig {
pub watch: String,
pub emit: EmitConfig,
}
#[derive(Debug, Deserialize, Clone)]
pub struct EmitConfig {
pub event: String,
pub payload: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct AuthConfig {
#[serde(rename = "userConnector")]
pub user_connector: String,
#[serde(rename = "identityField")]
pub identity_field: String,
#[serde(rename = "passwordField")]
pub password_field: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ConnectorConfig {
#[serde(rename = "type")]
pub connector_type: String,
pub collection: Option<String>,
#[serde(default)]
pub initial_state: serde_json::Value,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(untagged)] pub enum ComponentConfig {
Simple(String),
Detailed {
template: String,
style: Option<String>,
},
}
#[derive(Debug, Deserialize, Clone)]
pub struct Route {
#[serde(rename = "type")]
pub route_type: String,
#[serde(default)]
pub reads: Vec<String>,
#[serde(default)]
pub writes: Vec<String>,
pub update: Option<String>,
#[serde(default)]
pub steps: Vec<Step>,
pub internal: Option<bool>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Step {
pub set: Option<String>,
pub to: Option<String>,
#[serde(rename = "if")]
pub condition: Option<String>,
pub then: Option<Vec<Step>>,
#[serde(rename = "else")] pub an_else: Option<Vec<Step>>,
#[serde(rename = "action:run")]
pub action_run: Option<ActionRunStep>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ActionRunStep {
pub name: String,
}