Skip to main content

commit_wizard/engine/constants/defaults/
config.rs

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
32//
33// ──────────────────────────────────────────────────────────────────────────────
34// Collections / dynamic defaults
35// ──────────────────────────────────────────────────────────────────────────────
36//
37
38pub 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
165//
166// ──────────────────────────────────────────────────────────────────────────────
167// Structured config defaults
168// These are useful for BaseConfig accessors and template generation
169// ──────────────────────────────────────────────────────────────────────────────
170//
171
172pub 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
366//
367// ──────────────────────────────────────────────────────────────────────────────
368// BaseConfig presets
369// ──────────────────────────────────────────────────────────────────────────────
370//
371
372pub 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}