Skip to main content

quanttide_devops/contract/
stage.rs

1use serde::{Deserialize, Serialize};
2
3// ── Stages(时序维度)────────────────────────────────────────────────
4
5/// 生命周期阶段配置。
6///
7/// 不规定"怎么做",只规定"什么时候检查什么"。
8#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "snake_case")]
10pub struct Stage {
11    #[serde(default)]
12    pub build: StageBuild,
13    #[serde(default)]
14    pub test: StageTest,
15    #[serde(default)]
16    pub release: StageRelease,
17}
18
19impl Default for Stage {
20    fn default() -> Self {
21        Self {
22            build: StageBuild { command: None },
23            test: StageTest {
24                command: None,
25                threshold: 70.0,
26            },
27            release: StageRelease {
28                changelog: "CHANGELOG.md".into(),
29                pre_publish: Vec::new(),
30            },
31        }
32    }
33}
34
35/// 构建阶段。
36#[derive(Debug, Clone, Default, Serialize, Deserialize)]
37#[serde(rename_all = "snake_case")]
38pub struct StageBuild {
39    #[serde(default)]
40    pub command: Option<String>,
41}
42
43/// 测试阶段。
44#[derive(Debug, Clone, Serialize, Deserialize)]
45#[serde(rename_all = "snake_case")]
46pub struct StageTest {
47    #[serde(default)]
48    pub command: Option<String>,
49    #[serde(default = "default_threshold")]
50    pub threshold: f64,
51}
52
53impl Default for StageTest {
54    fn default() -> Self {
55        Self {
56            command: None,
57            threshold: 70.0,
58        }
59    }
60}
61
62const fn default_threshold() -> f64 {
63    70.0
64}
65
66/// 发布阶段。
67#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(rename_all = "snake_case")]
69pub struct StageRelease {
70    #[serde(default = "default_changelog")]
71    pub changelog: String,
72    #[serde(default)]
73    pub pre_publish: Vec<String>,
74}
75
76fn default_changelog() -> String {
77    "CHANGELOG.md".into()
78}
79
80impl Default for StageRelease {
81    fn default() -> Self {
82        Self {
83            changelog: "CHANGELOG.md".into(),
84            pre_publish: Vec::new(),
85        }
86    }
87}