use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
#[serde(deny_unknown_fields)]
pub struct Config {
#[serde(default)]
pub meta: Meta,
#[serde(default)]
pub include: Vec<String>,
#[serde(default)]
pub paths: BTreeMap<String, String>,
#[serde(default, rename = "link")]
pub links: Vec<Link>,
#[serde(default, rename = "template")]
pub templates: Vec<Template>,
#[serde(default)]
pub prompts: BTreeMap<String, PromptSection>,
#[serde(default, rename = "deps")]
pub deps: Vec<DepsGroup>,
#[serde(default, rename = "hook")]
pub hooks: Vec<Hook>,
#[serde(default, rename = "command")]
pub commands: Vec<Command>,
}
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
#[serde(deny_unknown_fields)]
pub struct Meta {
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub krypt_min: Option<String>,
#[serde(default)]
pub notify_backend: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct Link {
#[serde(default)]
pub src: Option<String>,
#[serde(default)]
pub src_glob: Option<String>,
pub dst: String,
#[serde(default)]
pub platform: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct Template {
pub src: String,
pub dst: String,
#[serde(default)]
pub prompts: Vec<String>,
#[serde(default)]
pub platform: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct PromptSection {
#[serde(default)]
pub heading: String,
pub fields: Vec<PromptField>,
pub writer: String,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct PromptField {
pub key: String,
pub prompt: String,
#[serde(default = "default_prompt_type")]
pub r#type: String,
#[serde(default)]
pub default: Option<toml::Value>,
#[serde(default)]
pub default_from: Option<String>,
#[serde(default)]
pub read_var: Option<String>,
#[serde(default)]
pub optional: bool,
#[serde(default)]
pub requires: Option<String>,
}
fn default_prompt_type() -> String {
"string".into()
}
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
#[serde(deny_unknown_fields)]
pub struct DepsGroup {
pub group: String,
#[serde(default)]
pub required_platforms: Vec<String>,
#[serde(default)]
pub pacman: Vec<String>,
#[serde(default)]
pub apt: Vec<String>,
#[serde(default)]
pub dnf: Vec<String>,
#[serde(default)]
pub brew: Vec<String>,
#[serde(default)]
pub scoop: Vec<String>,
#[serde(default)]
pub winget: Vec<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct Hook {
pub name: String,
pub when: String,
#[serde(default)]
pub r#if: Option<String>,
pub run: Vec<String>,
#[serde(default)]
pub ignore_failure: bool,
}
#[derive(Debug, Deserialize, Serialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct Command {
pub group: String,
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub platform: Option<String>,
pub steps: Vec<Step>,
}
#[derive(Debug, Deserialize, Serialize, Default, Clone)]
#[serde(deny_unknown_fields)]
pub struct Step {
#[serde(default)]
pub run: Option<Vec<String>>,
#[serde(default)]
pub pipe: Option<Vec<String>>,
#[serde(default)]
pub notify: Option<Vec<String>>,
#[serde(default)]
pub capture: Option<String>,
#[serde(default)]
pub input: Option<String>,
#[serde(default)]
pub r#if: Option<String>,
#[serde(default)]
pub on_fail: Option<String>,
#[serde(default)]
pub ignore_failure: bool,
}