use std::collections::BTreeMap;
use serde::Deserialize;
#[derive(Debug, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawConfig {
#[serde(default)]
pub version: Option<u32>,
#[serde(default)]
pub issues: Option<RawIssues>,
#[serde(default)]
pub decisions: Option<RawDecisions>,
#[serde(default)]
pub sources: BTreeMap<String, RawSource>,
#[serde(default)]
pub docs: BTreeMap<String, RawDocsEntry>,
#[serde(default)]
pub site: Option<RawSite>,
#[serde(default)]
pub query: Option<RawQuery>,
#[serde(default)]
pub tags: BTreeMap<String, RawTagDescriptor>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawQuery {
#[serde(default)]
pub dir: Option<String>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawSite {
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub theme: Option<String>,
#[serde(default)]
pub out: Option<String>,
#[serde(default)]
pub nav: Vec<RawNavEntry>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawNavEntry {
pub label: String,
pub url: String,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawIssues {
#[serde(default = "default_issues_dir")]
pub dir: String,
#[serde(default)]
pub union: Vec<String>,
#[serde(default)]
pub id_prefix: Option<String>,
#[serde(default)]
pub preset: Option<String>,
#[serde(default)]
pub initial: Option<String>,
#[serde(default)]
pub statuses: BTreeMap<String, RawStatusConfig>,
}
impl Default for RawIssues {
fn default() -> Self {
Self {
dir: default_issues_dir(),
union: Vec::new(),
id_prefix: None,
preset: None,
initial: None,
statuses: BTreeMap::new(),
}
}
}
fn default_issues_dir() -> String {
"docs/issues".to_string()
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawStatusConfig {
#[serde(default)]
pub next: Vec<String>,
#[serde(default)]
pub active: bool,
#[serde(default)]
pub terminal: bool,
#[serde(default)]
pub label: Option<String>,
#[serde(default = "default_status_category")]
pub category: String,
}
fn default_status_category() -> String {
"unknown".to_string()
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawTagDescriptor {
#[serde(default)]
pub levels: Vec<String>,
#[serde(default = "default_cardinality")]
pub cardinality: String,
#[serde(default)]
pub ordered: bool,
#[serde(default)]
pub weights: Option<Vec<u32>>,
#[serde(default)]
pub aggregate: Option<String>,
#[serde(default)]
pub applies_to: Vec<String>,
}
fn default_cardinality() -> String {
"any".to_string()
}
#[derive(Debug, Default, Deserialize)]
pub struct RawDecisions {
#[serde(default)]
pub types: Vec<String>,
#[serde(flatten)]
pub kinds: BTreeMap<String, RawDecisionKind>,
}
#[derive(Debug, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawDecisionKind {
#[serde(default)]
pub dir: Option<String>,
#[serde(default)]
pub union: Vec<String>,
#[serde(default)]
pub id_prefix: Option<String>,
#[serde(default)]
pub statuses: Option<toml::Value>,
#[serde(default)]
pub preset: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawDocsEntry {
#[serde(rename = "type")]
pub kind: String,
pub source: String,
pub publish: String,
}
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RawSource {
#[serde(rename = "type")]
pub source_type: String,
pub url: String,
pub project: String,
pub token_env: String,
#[serde(default)]
pub status_map: BTreeMap<String, String>,
}