ci_info/lib.rs
1#![deny(
2 future_incompatible,
3 keyword_idents,
4 let_underscore,
5 nonstandard_style,
6 unused
7)]
8#![warn(unknown_lints)]
9
10//! # ci_info
11//!
12//! Provides current CI environment information.
13//!
14//! This library main goal is to provide development/build tools such as [cargo-make](https://sagiegurari.github.io/cargo-make/) the needed information on the current CI environment.<br>
15//! The code is based on the [ci-info](https://github.com/watson/ci-info) npm module.
16//!
17//! # Examples
18//!
19//! ## Get CI environment information
20//!
21//! ```
22//! fn main() {
23//! // Just check if a CI environment is detected.
24//! let ci = ci_info::is_ci();
25//! println!("Is CI: {}", ci);
26//!
27//! // Get CI environment information
28//! let info = ci_info::get();
29//! println!("Is CI: {}", info.ci);
30//! if let Some(vendor) = info.vendor {
31//! println!("Vendor: {:#?}", vendor);
32//! println!("Name: {:#?}", info.name.unwrap());
33//! }
34//! if let Some(pr) = info.pr {
35//! println!("Is PR: {:#?}", pr);
36//! }
37//! if let Some(branch_name) = info.branch_name {
38//! println!("Branch Name: {:#?}", branch_name);
39//! }
40//! }
41//! ```
42//!
43//! ## Check if a CI environment is detected
44//!
45//! ```
46//! fn main() {
47//! let ci = ci_info::is_ci();
48//!
49//! println!("Is CI: {}", ci);
50//! }
51//! ```
52//!
53//! ## Mocking CI environment
54//!
55//! ```
56//! use ci_info::types::{CiInfo, Vendor};
57//!
58//! fn main() {
59//! // create the CI info manually
60//! let mut mock_info = CiInfo::new();
61//! mock_info.vendor = Some(Vendor::TravisCI);
62//! mock_info.ci = true;
63//! mock_info.pr = Some(true);
64//! mock_info.branch_name = Some("dev_branch".to_string());
65//!
66//! // mock environment
67//! ci_info::mock_ci(&mock_info);
68//!
69//! let info = ci_info::get();
70//!
71//! assert!(info.ci);
72//! assert!(info.pr.unwrap());
73//! assert_eq!(info.vendor.unwrap(), Vendor::TravisCI);
74//! assert_eq!(info.name.unwrap(), "Travis CI");
75//! assert_eq!(info.branch_name.unwrap(), "dev_branch");
76//!
77//! // clear CI environment
78//! mock_info = CiInfo::new();
79//! ci_info::mock_ci(&mock_info);
80//!
81//! let info = ci_info::get();
82//!
83//! assert!(!info.ci);
84//! }
85//! ```
86//!
87//! # Installation
88//! In order to use this library, just add it as a dependency:
89//!
90//! ```ini
91//! [dependencies]
92//! ci_info = "*"
93//! ```
94//!
95//! There is optional `serde` support that can be enabled via the `serde-1` feature:
96//!
97//! ```ini
98//! [dependencies]
99//! ci_info = { version = "*", features = ["serde-1"] }
100//! ```
101//!
102//! ## Iterating Over Vendor Variants (Optional Feature)
103//!
104//! When `iter` feature is enabled, you can iterate over all known CI vendor variants:
105//!
106//! ```toml
107//! [dependencies]
108//! ci_info = { version = "*", features = ["iter"] }
109//! ```
110//!
111//! Example usage:
112//!
113//! ```rust
114//! # #[cfg(feature = "iter")]
115//! # {
116//! use ci_info::types::Vendor;
117//! use strum::IntoEnumIterator;
118//!
119//! // List all supported CI vendors
120//! for vendor in Vendor::iter() {
121//! println!("Supported CI vendor: {:?}", vendor);
122//! }
123//!
124//! // Count vendors
125//! let vendor_count = Vendor::iter().count();
126//! println!("Total CI vendors supported: {}", vendor_count);
127//!
128//! // Filter for specific vendors
129//! let cloud_vendors: Vec<_> = Vendor::iter()
130//! .filter(|v| matches!(v,
131//! Vendor::GitHubActions |
132//! Vendor::GitLabCI |
133//! Vendor::CircleCI
134//! ))
135//! .collect();
136//! # }
137//! ```
138//!
139//! This feature uses [strum](https://crates.io/crates/strum) library's `EnumIter` derive macro.
140//!
141//! # Contributing
142//! See [contributing guide](https://github.com/sagiegurari/ci_info/blob/master/.github/CONTRIBUTING.md)
143//!
144//! # License
145//! Developed by Sagie Gur-Ari and licensed under the
146//! [Apache 2](https://github.com/sagiegurari/ci_info/blob/master/LICENSE) open source license.
147//!
148
149#[cfg(feature = "serde-1")]
150#[macro_use]
151extern crate serde_derive;
152#[cfg(test)]
153#[path = "./config_test.rs"]
154mod config_test;
155#[cfg(test)]
156#[path = "./lib_test.rs"]
157mod lib_test;
158#[cfg(test)]
159#[path = "./test_env.rs"]
160mod test_env;
161
162#[cfg(doctest)]
163doc_comment::doctest!("../README.md");
164
165mod ci;
166mod config;
167mod mock;
168pub mod types;
169
170use crate::types::CiInfo;
171
172/// Loads and returns the CI info of the current environment.
173///
174/// # Example
175///
176/// ```
177/// fn main() {
178/// // Just check if a CI environment is detected.
179/// let ci = ci_info::is_ci();
180/// println!("Is CI: {}", ci);
181///
182/// // Get CI environment information
183/// let info = ci_info::get();
184/// println!("Is CI: {}", info.ci);
185/// if info.vendor.is_some() {
186/// println!("Vendor: {:#?}", info.vendor.unwrap());
187/// println!("Name: {:#?}", info.name.unwrap());
188/// }
189/// if info.pr.is_some() {
190/// println!("Is PR: {:#?}", info.pr.unwrap());
191/// }
192/// if info.branch_name.is_some() {
193/// println!("Branch Name: {:#?}", info.branch_name.unwrap());
194/// }
195/// }
196/// ```
197pub fn get() -> CiInfo {
198 ci::get()
199}
200
201/// Returns true if a CI environment is detected.
202///
203/// # Example
204///
205/// ```
206/// fn main() {
207/// let ci = ci_info::is_ci();
208///
209/// println!("Is CI: {}", ci);
210/// }
211/// ```
212pub fn is_ci() -> bool {
213 ci::is_ci()
214}
215
216/// This function will modify the current environment variables to mock the
217/// requested CI vendor.
218///
219/// # Example
220///
221/// ```
222/// use ci_info::types::{CiInfo, Vendor};
223///
224/// fn main() {
225/// // create the CI info manually
226/// let mut mock_info = CiInfo::new();
227/// mock_info.vendor = Some(Vendor::TravisCI);
228/// mock_info.ci = true;
229/// mock_info.pr = Some(true);
230/// mock_info.branch_name = Some("dev_branch".to_string());
231///
232/// // mock environment
233/// ci_info::mock_ci(&mock_info);
234///
235/// let info = ci_info::get();
236///
237/// assert!(info.ci);
238/// assert!(info.pr.unwrap());
239/// assert_eq!(info.vendor.unwrap(), Vendor::TravisCI);
240/// assert_eq!(info.name.unwrap(), "Travis CI");
241/// assert_eq!(info.branch_name.unwrap(), "dev_branch");
242///
243/// // clear CI environment
244/// mock_info = CiInfo::new();
245/// ci_info::mock_ci(&mock_info);
246///
247/// let info = ci_info::get();
248///
249/// assert!(!info.ci);
250/// }
251/// ```
252pub fn mock_ci(info: &CiInfo) {
253 mock::mock_ci_info(info);
254}