Skip to main content

alpine_protocol_sdk/
environment.rs

1use std::env;
2use std::path::Path;
3
4use crate::error::AlpineSdkError;
5
6#[derive(Debug, Clone)]
7pub enum EnvironmentIssue {
8    Wsl,
9    Ci,
10    Docker,
11}
12
13impl EnvironmentIssue {
14    pub fn label(&self) -> &'static str {
15        match self {
16            EnvironmentIssue::Wsl => "WSL",
17            EnvironmentIssue::Ci => "CI",
18            EnvironmentIssue::Docker => "Docker",
19        }
20    }
21}
22
23pub fn detect_environment_issues() -> Vec<EnvironmentIssue> {
24    let mut issues = Vec::new();
25    if env::var("WSL_DISTRO_NAME").is_ok() || env::var("WSL_INTEROP").is_ok() {
26        issues.push(EnvironmentIssue::Wsl);
27    }
28    if env::var("CI").is_ok()
29        || env::var("GITHUB_ACTIONS").is_ok()
30        || env::var("BUILD_BUILDID").is_ok()
31    {
32        issues.push(EnvironmentIssue::Ci);
33    }
34    if env::var("DOCKER").is_ok() || Path::new("/.dockerenv").exists() {
35        issues.push(EnvironmentIssue::Docker);
36    }
37    issues
38}
39
40pub fn ensure_supported_environment() -> Result<(), AlpineSdkError> {
41    let issues = detect_environment_issues();
42    if issues.is_empty() {
43        return Ok(());
44    }
45    let labels = issues
46        .iter()
47        .map(|issue| issue.label())
48        .collect::<Vec<_>>()
49        .join(", ");
50    Err(AlpineSdkError::UnsupportedEnvironment(format!(
51        "{} detected; network discovery/control may be blocked",
52        labels
53    )))
54}