1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
//! # types
//!
//! Defines the various types and aliases.
//!

#[cfg(test)]
#[path = "./types_test.rs"]
mod types_test;

#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Copy)]
#[non_exhaustive]
/// Supported vendors enum
pub enum Vendor {
    /// CI vendor
    Agola,
    /// CI vendor
    AppCenter,
    /// CI vendor
    AppCircle,
    /// CI vendor
    AppVeyor,
    /// CI vendor
    AWSCodeBuild,
    /// CI vendor
    AzurePipelines,
    /// CI vendor
    Bamboo,
    /// CI vendor
    BitbucketPipelines,
    /// CI vendor
    Bitrise,
    /// CI vendor
    Buddy,
    /// CI vendor
    Buildkite,
    /// CI vendor
    CircleCI,
    /// CI vendor
    CirrusCI,
    /// CI vendor
    Codefresh,
    /// CI vendor
    Codemagic,
    /// CI vendor
    Codeship,
    /// CI vendor
    Drone,
    /// CI vendor
    DSARI,
    /// CI vendor
    EARTHLY,
    /// CI vendor
    FlowCI,
    /// CI vendor
    GiteaActions,
    /// CI vendor
    GitLabCI,
    /// CI vendor
    GitHubActions,
    /// CI vendor
    Gerrit,
    /// CI vendor
    GoCD,
    /// CI vendor
    GoogleCloudBuild,
    /// CI vendor
    HarnessCI,
    /// CI vendor
    Heroku,
    /// CI vendor
    Hudson,
    /// CI vendor
    Jenkins,
    /// CI vendor
    JenkinsX,
    /// CI vendor
    LayerCI,
    /// CI vendor
    MagnumCI,
    /// CI vendor
    NetlifyCI,
    /// CI vendor
    Nevercode,
    /// CI vendor
    Prow,
    /// CI vendor
    Render,
    /// CI vendor
    SailCI,
    /// CI vendor
    Screwdriver,
    /// CI vendor
    Semaphore,
    /// CI vendor
    SourceHut,
    /// CI vendor
    StriderCD,
    /// CI vendor
    TaskCluster,
    /// CI vendor
    TeamCity,
    /// CI vendor
    TravisCI,
    /// CI vendor
    Vela,
    /// CI vendor
    Vercel,
    /// CI vendor
    WoodpeckerCI,
    /// CI vendor
    XcodeCloud,
    /// CI vendor
    XcodeServer,
    /// CI vendor
    Unknown,
}

#[derive(Debug, Clone)]
pub(crate) enum EnvValue {
    /// Env name
    Exists(String),
    /// Env names
    AllExists(Vec<String>),
    /// Env names
    AnyExists(Vec<String>),
    /// Env name and value
    Value(String, String),
    /// Env name and value which should not be defined
    NotEqual(String, String),
    /// Env name contains the provided value (case insensitive)
    Contains(String, String),
    /// Env value exists and not empty
    NotEmpty(String),
}

/// Vendor detection info
#[derive(Debug, Clone)]
pub(crate) struct VendorConfig {
    /// vendor name
    pub(crate) name: String,
    /// The CI vendor
    pub(crate) vendor: Vendor,
    /// CI env var name
    pub(crate) ci_env: EnvValue,
    /// PR env var name
    pub(crate) pr_env: Option<EnvValue>,
    /// Branch name env var name
    pub(crate) branch_name_env: Option<String>,
}

#[cfg_attr(feature = "serde-1", derive(Serialize, Deserialize))]
#[derive(Debug, Clone, PartialEq, Default)]
/// CI info
pub struct CiInfo {
    /// The CI vendor
    pub vendor: Option<Vendor>,
    /// vendor name
    pub name: Option<String>,
    /// True if CI environment
    pub ci: bool,
    /// True if currently running a PR build, None if unknown
    pub pr: Option<bool>,
    /// The branch name for the given build
    pub branch_name: Option<String>,
}

impl CiInfo {
    /// Returns new instance
    pub fn new() -> CiInfo {
        Default::default()
    }
}