alpine-protocol-sdk 0.2.4

High-level SDK on top of the ALPINE protocol layer.
Documentation
use std::env;
use std::sync::OnceLock;

use tracing::{info, warn};

use crate::environment::detect_environment_issues;

static SELF_CHECK_RUN: OnceLock<()> = OnceLock::new();

pub fn run_sdk_self_check() {
    if SELF_CHECK_RUN.set(()).is_err() {
        return;
    }

    let mut ok = true;
    if env::var("ALPINE_ATTESTERS_URL").is_ok() {
        info!("[ALPINE][SELF-CHECK] attesters URL configured");
    } else {
        warn!("[ALPINE][SELF-CHECK][WARN] ALPINE_ATTESTERS_URL missing");
        ok = false;
    }

    if env::var("ALPINE_ROOT_PUBKEY_B64").is_ok() {
        info!("[ALPINE][SELF-CHECK] root pubkey configured");
    } else {
        warn!("[ALPINE][SELF-CHECK][WARN] ALPINE_ROOT_PUBKEY_B64 missing");
        ok = false;
    }

    let issues = detect_environment_issues();
    if issues.is_empty() {
        info!("[ALPINE][SELF-CHECK] environment looks supported");
    } else {
        let labels = issues
            .iter()
            .map(|issue| issue.label())
            .collect::<Vec<_>>()
            .join(", ");
        warn!(
            "[ALPINE][SELF-CHECK][WARN] environment issues detected: {}",
            labels
        );
        ok = false;
    }

    if ok {
        info!("[ALPINE][SELF-CHECK] ready");
    } else {
        warn!("[ALPINE][SELF-CHECK][WARN] readiness checks failed");
    }
}