Skip to main content

quanttide_devops/contract/
platform.rs

1//! 平台配置:源码管理、CI/CD、制品仓库的枚举与解析。
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6// ── Platforms(载体维度)──────────────────────────────────────────────
7
8/// 外部治理载体配置。
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "snake_case")]
11pub struct Platform {
12    #[serde(default)]
13    pub source_control: SourceControl,
14    #[serde(default)]
15    pub pipeline: Pipeline,
16    #[serde(default)]
17    pub artifact_registry: Registry,
18}
19
20impl Default for Platform {
21    fn default() -> Self {
22        Self {
23            source_control: SourceControl::Github,
24            pipeline: Pipeline::GithubActions,
25            artifact_registry: Registry::None,
26        }
27    }
28}
29
30/// 源代码管理平台。
31#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
32#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
33#[serde(rename_all = "snake_case")]
34pub enum SourceControl {
35    #[default]
36    Github,
37    Gitlab,
38    Gitee,
39}
40
41/// Pipeline 平台。
42#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
43#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
44#[serde(rename_all = "snake_case")]
45pub enum Pipeline {
46    #[default]
47    #[serde(rename = "github_actions")]
48    GithubActions,
49    #[serde(rename = "gitlab_ci")]
50    GitlabCi,
51    Jenkins,
52}
53
54/// 制品库类型。
55///
56/// 既可用于全局 `Platforms.artifact_registry`,也可用于 scope 级别覆盖。
57#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
58#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
59#[serde(rename_all = "snake_case")]
60pub enum Registry {
61    Crates,
62    #[serde(rename = "pypi")]
63    PyPI,
64    #[serde(rename = "pubdev")]
65    PubDev,
66    Npm,
67    #[serde(rename = "github_releases")]
68    GitHubReleases,
69    Docker,
70    #[default]
71    #[serde(other)]
72    None,
73}
74
75impl fmt::Display for Registry {
76    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
77        match self {
78            Self::Crates => write!(f, "crates.io"),
79            Self::PyPI => write!(f, "PyPI"),
80            Self::PubDev => write!(f, "pub.dev"),
81            Self::Npm => write!(f, "npm"),
82            Self::GitHubReleases => write!(f, "GitHub Releases"),
83            Self::Docker => write!(f, "Docker"),
84            Self::None => write!(f, "(none)"),
85        }
86    }
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    #[test]
94    fn test_registry_display() {
95        assert_eq!(Registry::Crates.to_string(), "crates.io");
96        assert_eq!(Registry::PyPI.to_string(), "PyPI");
97        assert_eq!(Registry::PubDev.to_string(), "pub.dev");
98        assert_eq!(Registry::Npm.to_string(), "npm");
99        assert_eq!(Registry::GitHubReleases.to_string(), "GitHub Releases");
100        assert_eq!(Registry::Docker.to_string(), "Docker");
101        assert_eq!(Registry::None.to_string(), "(none)");
102    }
103}