alpine-protocol-sdk 0.2.4

High-level SDK on top of the ALPINE protocol layer.
Documentation
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
    )))
}