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
//! # 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)]
/// Supported vendors enum
pub enum Vendor {
    /// CI vendor
    AppCenter,
    /// CI vendor
    AppVeyor,
    /// 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
    AWSCodeBuild,
    /// CI vendor
    Codeship,
    /// CI vendor
    Drone,
    /// CI vendor
    DSARI,
    /// CI vendor
    GitLabCI,
    /// CI vendor
    GitHubActions,
    /// CI vendor
    GoCD,
    /// CI vendor
    Heroku,
    /// CI vendor
    Hudson,
    /// CI vendor
    Jenkins,
    /// CI vendor
    MagnumCI,
    /// CI vendor
    NetlifyCI,
    /// CI vendor
    Nevercode,
    /// CI vendor
    Render,
    /// CI vendor
    SailCI,
    /// CI vendor
    Screwdriver,
    /// CI vendor
    Semaphore,
    /// CI vendor
    Shippable,
    /// CI vendor
    SolanoCI,
    /// CI vendor
    StriderCD,
    /// CI vendor
    TaskCluster,
    /// CI vendor
    TeamCity,
    /// CI vendor
    TravisCI,
    /// CI vendor
    ZEITNow,
    /// 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()
    }
}