1use std::collections::{BTreeMap, HashMap};
2
3use crate::engine::constants::{
4 AI_COMMAND_CHANGELOG, AI_COMMAND_COMMIT, AI_COMMAND_RELEASE_PREPARE, AI_ENABLED,
5 BRANCH_NAMING_PATTERN, BRANCH_REMOTE, CHANGELOG_FORMAT, CHANGELOG_MISC_SECTION,
6 CHANGELOG_OUTPUT, CHANGELOG_SHOW_EMPTY_SCOPES, CHANGELOG_SHOW_EMPTY_SECTIONS,
7 CHANGELOG_SHOW_SCOPE, CHECK_COMMITS_ENABLED, CHECK_COMMITS_ENFORCE_ON,
8 CHECK_REQUIRE_CONVENTIONAL, COMMIT_BREAKING_FOOTER_KEY, COMMIT_BREAKING_REQUIRE_FOOTER,
9 COMMIT_BREAKING_REQUIRE_HEADER, COMMIT_PROTECTED_ALLOW, COMMIT_PROTECTED_FORCE,
10 COMMIT_PROTECTED_WARN, COMMIT_SCOPE_MODE, COMMIT_SCOPE_RESTRICT_TO_DEFINED,
11 COMMIT_SUBJECT_MAX_LENGTH, COMMIT_TICKET_REQUIRED, COMMIT_TICKET_SOURCE, COMMIT_USE_EMOJIS,
12 HOOKS_COMMIT_MSG, HOOKS_PRE_COMMIT, HOOKS_PRE_PUSH, PR_ENABLED, PUSH_ALLOW_FORCE,
13 PUSH_ALLOW_PROTECTED, PUSH_CHECK_BRANCH_POLICY, PUSH_CHECK_COMMITS, RELEASE_BRANCH_FORMAT,
14 RELEASE_ENABLED, RELEASE_FAIL_IF_RELEASE_BRANCH_EXISTS, RELEASE_FAIL_IF_TAG_EXISTS,
15 RELEASE_FINISH_BACKMERGE_BRANCH, RELEASE_FINISH_PUSH, RELEASE_FINISH_TAG,
16 RELEASE_HOTFIX_PATTERN, RELEASE_REQUIRE_CLEAN_WORKTREE, RELEASE_SOURCE_BRANCH,
17 RELEASE_TARGET_BRANCH, VERSIONING_TAG_PREFIX,
18};
19use crate::engine::{
20 config::base::{
21 AiCommandsConfig, AiConfig, BranchConfig, BranchNamingConfig, BreakingConfig,
22 ChangelogConfig, ChangelogLayoutConfig, CheckCommitsConfig, CheckConfig, CommitConfig,
23 CommitProtectedConfig, CommitScopesConfig, CommitTypeConfig, HooksConfig,
24 NamedRegistryConfig, PrConfig, PushAllowConfig, PushCheckConfig, PushConfig,
25 RegistryConfig, ReleaseConfig, ReleaseFinishConfig, ReleaseValidationConfig, TicketConfig,
26 VersioningConfig,
27 },
28 constants::AI_PROVIDER,
29 models::policy::enforcement::BumpLevel,
30};
31
32pub fn default_commit_allowed_scopes() -> Vec<String> {
39 Vec::new()
40}
41
42pub fn default_commit_types() -> BTreeMap<String, CommitTypeConfig> {
43 let mut map = BTreeMap::new();
44
45 map.insert(
46 "feat".to_string(),
47 CommitTypeConfig {
48 emoji: Some("✨".to_string()),
49 description: Some("A new feature".to_string()),
50 bump: Some(BumpLevel::Minor),
51 section: Some("Features".to_string()),
52 },
53 );
54
55 map.insert(
56 "fix".to_string(),
57 CommitTypeConfig {
58 emoji: Some("🐛".to_string()),
59 description: Some("A bug fix".to_string()),
60 bump: Some(BumpLevel::Patch),
61 section: Some("Bug Fixes".to_string()),
62 },
63 );
64
65 map.insert(
66 "docs".to_string(),
67 CommitTypeConfig {
68 emoji: Some("📚".to_string()),
69 description: Some("Documentation changes".to_string()),
70 bump: Some(BumpLevel::Patch),
71 section: Some("Documentation".to_string()),
72 },
73 );
74
75 map.insert(
76 "style".to_string(),
77 CommitTypeConfig {
78 emoji: Some("🎨".to_string()),
79 description: Some("Code style changes".to_string()),
80 bump: Some(BumpLevel::Patch),
81 section: Some("Style".to_string()),
82 },
83 );
84
85 map.insert(
86 "refactor".to_string(),
87 CommitTypeConfig {
88 emoji: Some("♻️".to_string()),
89 description: Some("Code refactoring".to_string()),
90 bump: Some(BumpLevel::Patch),
91 section: Some("Refactoring".to_string()),
92 },
93 );
94
95 map.insert(
96 "perf".to_string(),
97 CommitTypeConfig {
98 emoji: Some("⚡".to_string()),
99 description: Some("Performance improvements".to_string()),
100 bump: Some(BumpLevel::Patch),
101 section: Some("Performance".to_string()),
102 },
103 );
104
105 map.insert(
106 "test".to_string(),
107 CommitTypeConfig {
108 emoji: Some("✅".to_string()),
109 description: Some("Test changes".to_string()),
110 bump: Some(BumpLevel::Patch),
111 section: Some("Tests".to_string()),
112 },
113 );
114
115 map.insert(
116 "chore".to_string(),
117 CommitTypeConfig {
118 emoji: Some("🔧".to_string()),
119 description: Some("Maintenance chores".to_string()),
120 bump: Some(BumpLevel::Patch),
121 section: Some("Chores".to_string()),
122 },
123 );
124
125 map
126}
127
128pub fn default_branch_protected_patterns() -> Vec<String> {
129 vec![
130 "main".to_string(),
131 "master".to_string(),
132 "release/*".to_string(),
133 ]
134}
135
136pub fn default_branch_allowed_targets() -> Vec<String> {
137 Vec::new()
138}
139
140pub fn default_changelog_group_by() -> Vec<String> {
141 vec!["type".to_string()]
142}
143
144pub fn default_changelog_section_order() -> Vec<String> {
145 vec![
146 "feat".to_string(),
147 "fix".to_string(),
148 "docs".to_string(),
149 "style".to_string(),
150 "refactor".to_string(),
151 "perf".to_string(),
152 "test".to_string(),
153 "chore".to_string(),
154 ]
155}
156
157pub fn default_changelog_scope_order() -> Vec<String> {
158 Vec::new()
159}
160
161pub fn default_registries() -> HashMap<String, NamedRegistryConfig> {
162 HashMap::new()
163}
164
165pub fn default_commit_scopes_config() -> CommitScopesConfig {
173 CommitScopesConfig {
174 mode: Some(COMMIT_SCOPE_MODE),
175 restrict_to_defined: Some(COMMIT_SCOPE_RESTRICT_TO_DEFINED),
176 definitions: None,
177 }
178}
179
180pub fn default_commit_breaking_config() -> BreakingConfig {
181 BreakingConfig {
182 require_header: Some(COMMIT_BREAKING_REQUIRE_HEADER),
183 require_footer: Some(COMMIT_BREAKING_REQUIRE_FOOTER),
184 footer_key: Some(COMMIT_BREAKING_FOOTER_KEY.to_string()),
185 footer_keys: None,
186 emoji: None,
187 emoji_mode: None,
188 }
189}
190
191pub fn default_commit_ticket_config() -> TicketConfig {
192 TicketConfig {
193 required: Some(COMMIT_TICKET_REQUIRED),
194 pattern: None,
195 source: Some(COMMIT_TICKET_SOURCE),
196 header_format: None,
197 }
198}
199
200pub fn default_commit_protected_config() -> CommitProtectedConfig {
201 CommitProtectedConfig {
202 allow: Some(COMMIT_PROTECTED_ALLOW),
203 force: Some(COMMIT_PROTECTED_FORCE),
204 warn: Some(COMMIT_PROTECTED_WARN),
205 }
206}
207
208pub fn default_commit_config() -> CommitConfig {
209 CommitConfig {
210 subject_max_length: Some(COMMIT_SUBJECT_MAX_LENGTH),
211 use_emojis: Some(COMMIT_USE_EMOJIS),
212 types: Some(default_commit_types()),
213 scopes: Some(default_commit_scopes_config()),
214 breaking: Some(default_commit_breaking_config()),
215 protected: Some(default_commit_protected_config()),
216 ticket: Some(default_commit_ticket_config()),
217 }
218}
219
220pub fn default_branch_naming_config() -> BranchNamingConfig {
221 BranchNamingConfig {
222 pattern: Some(BRANCH_NAMING_PATTERN.to_string()),
223 }
224}
225
226pub fn default_branch_config() -> BranchConfig {
227 BranchConfig {
228 remote: Some(BRANCH_REMOTE.to_string()),
229 protected: Some(default_branch_protected_patterns()),
230 naming: Some(default_branch_naming_config()),
231 }
232}
233
234pub fn default_pr_config() -> PrConfig {
235 PrConfig {
236 enabled: Some(PR_ENABLED),
237 title: None,
238 branch: None,
239 }
240}
241
242pub fn default_check_commits_config() -> CheckCommitsConfig {
243 CheckCommitsConfig {
244 enabled: Some(CHECK_COMMITS_ENABLED),
245 enforce_on: Some(CHECK_COMMITS_ENFORCE_ON),
246 }
247}
248
249pub fn default_check_config() -> CheckConfig {
250 CheckConfig {
251 require_conventional: Some(CHECK_REQUIRE_CONVENTIONAL),
252 commits: Some(default_check_commits_config()),
253 }
254}
255
256pub fn default_push_allow_config() -> PushAllowConfig {
257 PushAllowConfig {
258 protected: Some(PUSH_ALLOW_PROTECTED),
259 force: Some(PUSH_ALLOW_FORCE),
260 }
261}
262
263pub fn default_push_check_config() -> PushCheckConfig {
264 PushCheckConfig {
265 commits: Some(PUSH_CHECK_COMMITS),
266 branch_policy: Some(PUSH_CHECK_BRANCH_POLICY),
267 }
268}
269
270pub fn default_push_config() -> PushConfig {
271 PushConfig {
272 allow: Some(default_push_allow_config()),
273 check: Some(default_push_check_config()),
274 }
275}
276
277pub fn default_versioning_config() -> VersioningConfig {
278 VersioningConfig {
279 tag_prefix: Some(VERSIONING_TAG_PREFIX.to_string()),
280 }
281}
282
283pub fn default_changelog_layout_config() -> ChangelogLayoutConfig {
284 ChangelogLayoutConfig {
285 group_by: Some(default_changelog_group_by()),
286 section_order: Some(default_changelog_section_order()),
287 scope_order: Some(default_changelog_scope_order()),
288 show_scope: Some(CHANGELOG_SHOW_SCOPE),
289 show_empty_sections: Some(CHANGELOG_SHOW_EMPTY_SECTIONS),
290 show_empty_scopes: Some(CHANGELOG_SHOW_EMPTY_SCOPES),
291 misc_section: Some(CHANGELOG_MISC_SECTION.to_string()),
292 unreleased_label: None,
293 date_format: None,
294 }
295}
296
297pub fn default_changelog_config() -> ChangelogConfig {
298 ChangelogConfig {
299 output: Some(CHANGELOG_OUTPUT.to_string()),
300 format: Some(CHANGELOG_FORMAT),
301 header: None,
302 layout: Some(default_changelog_layout_config()),
303 sections: None,
304 }
305}
306
307pub fn default_release_validation_config() -> ReleaseValidationConfig {
308 ReleaseValidationConfig {
309 require_clean_worktree: Some(RELEASE_REQUIRE_CLEAN_WORKTREE),
310 fail_if_tag_exists: Some(RELEASE_FAIL_IF_TAG_EXISTS),
311 fail_if_release_branch_exists: Some(RELEASE_FAIL_IF_RELEASE_BRANCH_EXISTS),
312 }
313}
314
315pub fn default_release_finish_config() -> ReleaseFinishConfig {
316 ReleaseFinishConfig {
317 tag: Some(RELEASE_FINISH_TAG),
318 push: Some(RELEASE_FINISH_PUSH),
319 backmerge_branch: Some(RELEASE_FINISH_BACKMERGE_BRANCH.to_string()),
320 }
321}
322
323pub fn default_release_config() -> ReleaseConfig {
324 ReleaseConfig {
325 enabled: Some(RELEASE_ENABLED),
326 source_branch: Some(RELEASE_SOURCE_BRANCH.to_string()),
327 target_branch: Some(RELEASE_TARGET_BRANCH.to_string()),
328 branch_format: Some(RELEASE_BRANCH_FORMAT.to_string()),
329 hotfix_pattern: Some(RELEASE_HOTFIX_PATTERN.to_string()),
330 validation: Some(default_release_validation_config()),
331 finish: Some(default_release_finish_config()),
332 }
333}
334
335pub fn default_hooks_config() -> HooksConfig {
336 HooksConfig {
337 pre_commit: Some(HOOKS_PRE_COMMIT),
338 commit_msg: Some(HOOKS_COMMIT_MSG),
339 pre_push: Some(HOOKS_PRE_PUSH),
340 }
341}
342
343pub fn default_ai_commands_config() -> AiCommandsConfig {
344 AiCommandsConfig {
345 commit: Some(AI_COMMAND_COMMIT),
346 changelog: Some(AI_COMMAND_CHANGELOG),
347 release_prepare: Some(AI_COMMAND_RELEASE_PREPARE),
348 }
349}
350
351pub fn default_ai_config() -> AiConfig {
352 AiConfig {
353 enabled: Some(AI_ENABLED),
354 provider: Some(AI_PROVIDER.to_string()),
355 commands: Some(default_ai_commands_config()),
356 }
357}
358
359pub fn default_registry_config() -> RegistryConfig {
360 RegistryConfig {
361 use_registry: Some(String::new()),
362 section: None,
363 }
364}
365
366pub fn minimal_base_config() -> crate::engine::config::BaseConfig {
373 crate::engine::config::BaseConfig::empty()
374}
375
376pub fn standard_base_config() -> crate::engine::config::BaseConfig {
377 crate::engine::config::BaseConfig {
378 commit: Some(default_commit_config()),
379 branch: Some(default_branch_config()),
380 pr: Some(default_pr_config()),
381 check: Some(default_check_config()),
382 push: Some(default_push_config()),
383 versioning: Some(default_versioning_config()),
384 changelog: Some(default_changelog_config()),
385 release: Some(default_release_config()),
386 hooks: Some(default_hooks_config()),
387 ai: Some(default_ai_config()),
388 registry: None,
389 registries: None,
390 }
391}
392
393pub fn full_base_config() -> crate::engine::config::BaseConfig {
394 crate::engine::config::BaseConfig {
395 commit: Some(default_commit_config()),
396 branch: Some(default_branch_config()),
397 pr: Some(default_pr_config()),
398 check: Some(default_check_config()),
399 push: Some(default_push_config()),
400 versioning: Some(default_versioning_config()),
401 changelog: Some(default_changelog_config()),
402 release: Some(default_release_config()),
403 hooks: Some(default_hooks_config()),
404 ai: Some(default_ai_config()),
405 registry: Some(default_registry_config()),
406 registries: Some(default_registries()),
407 }
408}