1mod pre_commit_elements;
2pub use pre_commit_elements::*;
3
4use merge_it::*;
5#[cfg(feature = "schemars")]
6use schemars::JsonSchema;
7use serde::{Deserialize, Serialize};
8use std::collections::{BTreeMap, BTreeSet};
9
10type StringBTreeMap = BTreeMap<String, String>;
11
12#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Merge, Default)]
14#[cfg_attr(feature = "schemars", derive(JsonSchema))]
15#[serde(default)]
16pub struct PreCommitConfig {
17 #[serde(skip_serializing_if = "Option::is_none")]
19 pub minimum_pre_commit_version: Option<String>,
20
21 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
23 pub default_install_hook_types: BTreeSet<String>,
24
25 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
27 pub default_language_version: StringBTreeMap,
28
29 #[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
31 pub default_stages: BTreeSet<Stage>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub files: Option<String>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub exclude: Option<String>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub fail_fast: Option<bool>,
44
45 #[serde(skip_serializing_if = "Option::is_none")]
47 pub ci: Option<CiSettings>,
48
49 #[serde(skip_serializing_if = "BTreeSet::is_empty")]
51 pub repos: BTreeSet<Repo>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
56#[cfg_attr(feature = "schemars", derive(JsonSchema))]
57#[serde(untagged)]
58pub enum Repo {
59 Meta {
61 repo: MetaRepo,
62 #[serde(skip_serializing_if = "BTreeSet::is_empty")]
63 hooks: BTreeSet<MetaRepoHook>,
64 },
65 Local {
67 repo: LocalRepo,
68 #[serde(skip_serializing_if = "BTreeSet::is_empty")]
70 hooks: BTreeSet<PreCommitHook>,
71 },
72 Uri {
74 repo: String,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 rev: Option<String>,
79 #[serde(skip_serializing_if = "BTreeSet::is_empty")]
81 hooks: BTreeSet<PreCommitHook>,
82 },
83}
84
85#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
86#[cfg_attr(feature = "schemars", derive(JsonSchema))]
87#[serde(rename_all = "lowercase")]
88pub enum MetaRepo {
89 Meta,
90}
91
92#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
93#[cfg_attr(feature = "schemars", derive(JsonSchema))]
94#[serde(rename_all = "kebab-case")]
95pub enum MetaRepoId {
96 CheckHooksApply,
97 CheckUselessExcludes,
98 Identity,
99}
100
101#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
102#[cfg_attr(feature = "schemars", derive(JsonSchema))]
103#[serde(deny_unknown_fields)]
104pub struct MetaRepoHook {
105 pub id: MetaRepoId,
106}
107
108#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
109#[cfg_attr(feature = "schemars", derive(JsonSchema))]
110#[serde(rename_all = "lowercase")]
111pub enum LocalRepo {
112 Local,
113}
114
115#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default, Ord, PartialOrd)]
117#[cfg_attr(feature = "schemars", derive(JsonSchema))]
118#[serde(default)]
119#[serde(deny_unknown_fields)]
120pub struct PreCommitHook {
121 pub id: String,
123
124 #[serde(skip_serializing_if = "Option::is_none")]
126 pub additional_dependencies: Option<BTreeSet<String>>,
127
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub alias: Option<String>,
131
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub always_run: Option<bool>,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub args: Option<Vec<String>>,
139
140 #[serde(skip_serializing_if = "Option::is_none")]
142 pub entry: Option<String>,
143
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub exclude: Option<String>,
147
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub exclude_types: Option<BTreeSet<FileType>>,
151
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub description: Option<String>,
155
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub files: Option<String>,
159
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub language: Option<Language>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub language_version: Option<String>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
170 pub log_file: Option<String>,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub minimum_pre_commit_version: Option<usize>,
175
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub name: Option<String>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub pass_filenames: Option<bool>,
183
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub require_serial: Option<bool>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub stages: Option<BTreeSet<Stage>>,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub types: Option<BTreeSet<FileType>>,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub types_or: Option<BTreeSet<FileType>>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
202 pub verbose: Option<bool>,
203}