use regex::Regex;
use simple_error::SimpleError;
use log::trace;
use std::{
env::var_os,
io::{Result, Error, ErrorKind},
};
pub struct Env {
github_actions_branch_re: Regex,
github_actions_pull_request_re: Regex,
}
impl Env {
pub fn new() -> Env {
Env {
github_actions_branch_re: Regex::new(r"^refs/(?:heads|tags)/(.+)$").expect("Bad regex"),
github_actions_pull_request_re: Regex::new(r"^refs/pull/(.+)$").expect("Bad regex"),
}
}
pub fn get_var(&self, name: &str) -> Result<Option<String>> {
let value = match var_os(name) {
None => None,
Some(s) => match s.into_string() {
Ok(v) => (!v.is_empty()).then_some(v),
Err(err) => {
return Err(Error::new(ErrorKind::Other, SimpleError::new(format!("{:?}", err))));
}
},
};
trace!(
"Environment variable `{name}` is {}",
if value.is_some() { "set" } else { "unset" }
);
Ok(value)
}
pub(crate) fn get_github_actions_branch(&self) -> Result<Option<String>> {
if let Some(github_ref) = self.get_var("GITHUB_REF")? {
if let Some(captures) = self.github_actions_branch_re.captures(&github_ref) {
return Ok(Some(captures[1].to_string()));
}
}
self.get_var("GITHUB_HEAD_REF")
}
pub(crate) fn get_github_actions_pull_request(&self) -> Result<Option<String>> {
if let Some(github_ref) = self.get_var("GITHUB_REF")? {
if let Some(captures) = self.github_actions_pull_request_re.captures(&github_ref) {
return Ok(Some(captures[1].to_string()));
}
}
Ok(None)
}
}