alpine_protocol_sdk/
environment.rs1use 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}