Skip to main content

quanttide_devops/contract/
platform.rs

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