use crate::common;
use indexmap::IndexMap;
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct Config {
#[serde(deserialize_with = "common::non_empty_vec")]
pub repos: Vec<Repo>,
pub default_install_hook_types: Option<Vec<String>>,
#[serde(default)]
pub default_language_version: IndexMap<String, String>,
pub default_stages: Option<Vec<String>>,
#[serde(default)]
pub files: String,
#[serde(default)]
pub exclude: String,
#[serde(default)]
pub fail_fast: bool,
#[serde(default = "common::default_minimum_pre_commit_version")]
pub minimum_pre_commit_version: String,
}
#[derive(Debug, serde::Deserialize)]
#[serde(
rename_all = "snake_case",
rename_all_fields = "snake_case",
tag = "repo"
)]
pub enum Repo {
Local {},
Meta {},
Builtin {},
#[serde(untagged)]
Remote(RemoteRepo),
}
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct RemoteRepo {
pub repo: url::Url,
pub rev: String,
#[serde(deserialize_with = "common::non_empty_vec")]
pub hooks: Vec<Hook>,
}
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct Hook {
pub id: String,
pub alias: Option<String>,
pub name: Option<String>,
pub language_version: Option<String>,
pub files: Option<String>,
pub exclude: Option<String>,
pub types: Option<Vec<String>>,
pub types_or: Option<Vec<String>>,
pub exclude_types: Option<Vec<String>>,
#[serde(default)]
pub args: Vec<String>,
pub stages: Option<Vec<String>>,
#[serde(default)]
pub additional_dependencies: Vec<String>,
#[serde(default)]
pub always_run: bool,
#[serde(default)]
pub verbose: bool,
#[serde(default)]
pub log_file: Option<String>,
}