use std::env;
use std::path::Path;
use crate::error::AlpineSdkError;
#[derive(Debug, Clone)]
pub enum EnvironmentIssue {
Wsl,
Ci,
Docker,
}
impl EnvironmentIssue {
pub fn label(&self) -> &'static str {
match self {
EnvironmentIssue::Wsl => "WSL",
EnvironmentIssue::Ci => "CI",
EnvironmentIssue::Docker => "Docker",
}
}
}
pub fn detect_environment_issues() -> Vec<EnvironmentIssue> {
let mut issues = Vec::new();
if env::var("WSL_DISTRO_NAME").is_ok() || env::var("WSL_INTEROP").is_ok() {
issues.push(EnvironmentIssue::Wsl);
}
if env::var("CI").is_ok()
|| env::var("GITHUB_ACTIONS").is_ok()
|| env::var("BUILD_BUILDID").is_ok()
{
issues.push(EnvironmentIssue::Ci);
}
if env::var("DOCKER").is_ok() || Path::new("/.dockerenv").exists() {
issues.push(EnvironmentIssue::Docker);
}
issues
}
pub fn ensure_supported_environment() -> Result<(), AlpineSdkError> {
let issues = detect_environment_issues();
if issues.is_empty() {
return Ok(());
}
let labels = issues
.iter()
.map(|issue| issue.label())
.collect::<Vec<_>>()
.join(", ");
Err(AlpineSdkError::UnsupportedEnvironment(format!(
"{} detected; network discovery/control may be blocked",
labels
)))
}