Skip to main content

anodizer_core/config/
milestone.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3
4use super::ScmRepoConfig;
5
6// ---------------------------------------------------------------------------
7// MilestoneConfig
8// ---------------------------------------------------------------------------
9
10#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
11#[serde(default)]
12pub struct MilestoneConfig {
13    /// Repository owner/name. Auto-detected from git remote if not set.
14    pub repo: Option<ScmRepoConfig>,
15    /// Close the milestone on release. Default: false.
16    pub close: Option<bool>,
17    /// Fail the pipeline if milestone close fails. Default: false.
18    pub fail_on_error: Option<bool>,
19    /// Milestone name template (default: "{{ .Tag }}").
20    pub name_template: Option<String>,
21}
22
23impl MilestoneConfig {
24    /// Default milestone name template. Mirrors GoReleaser
25    /// `internal/pipe/milestone/milestone.go` (`cfg.NameTemplate = "{{.Tag}}"`).
26    /// Anodize uses Tera-style `{{ Tag }}`; the rendered value is
27    /// identical for any tag the project produces.
28    pub const DEFAULT_NAME_TEMPLATE: &'static str = "{{ Tag }}";
29
30    /// Resolve the milestone name template, falling back to
31    /// [`Self::DEFAULT_NAME_TEMPLATE`].
32    pub fn resolved_name_template(&self) -> &str {
33        self.name_template
34            .as_deref()
35            .unwrap_or(Self::DEFAULT_NAME_TEMPLATE)
36    }
37
38    /// Resolve `close`, falling back to `false` (don't close milestones
39    /// on release by default).
40    pub fn resolved_close(&self) -> bool {
41        self.close.unwrap_or(false)
42    }
43
44    /// Resolve `fail_on_error`, falling back to `false` (milestone close
45    /// errors are warnings by default; opt in to fail-the-build).
46    pub fn resolved_fail_on_error(&self) -> bool {
47        self.fail_on_error.unwrap_or(false)
48    }
49}