use crate::build_output::{SkewProtection, VercelDeploymentId};
use crate::contract::CONTRACT_FILE_ENV_VAR;
pub(crate) const CHECK_BUILD_DIR_ENV_VAR: &str = "__VORMA_CHECK_BUILD_DIR";
const DEV_PROCESS_ENV_VAR: &str = "__VORMA_IS_DEV";
pub(crate) const READINESS_PATH: &str = "/.vorma/healthz";
pub fn is_dev() -> bool {
std::env::var(DEV_PROCESS_ENV_VAR).is_ok_and(|value| value == "1")
}
pub fn is_build() -> bool {
std::env::var_os(CONTRACT_FILE_ENV_VAR).is_some()
|| std::env::var_os(CHECK_BUILD_DIR_ENV_VAR).is_some()
}
const VERCEL_SKEW_PROTECTION_ENABLED_ENV_VAR: &str = "VERCEL_SKEW_PROTECTION_ENABLED";
const VERCEL_DEPLOYMENT_ID_ENV_VAR: &str = "VERCEL_DEPLOYMENT_ID";
pub(crate) fn read_vercel_skew_protection() -> Result<SkewProtection, String> {
let Some(enabled) = std::env::var_os(VERCEL_SKEW_PROTECTION_ENABLED_ENV_VAR) else {
return Ok(SkewProtection::Off);
};
let enabled = match enabled.to_str() {
Some("true" | "yes" | "on" | "1" | "y") => true,
Some("false" | "no" | "off" | "0" | "n") => false,
_ => {
return Err(format!(
"{VERCEL_SKEW_PROTECTION_ENABLED_ENV_VAR} must be one of true, yes, on, 1, y, false, no, off, 0, or n"
));
}
};
if !enabled {
return Ok(SkewProtection::Off);
}
match std::env::var(VERCEL_DEPLOYMENT_ID_ENV_VAR)
.ok()
.and_then(VercelDeploymentId::new)
{
Some(deployment_id) => Ok(SkewProtection::Vercel { deployment_id }),
None => Err(format!(
"{VERCEL_SKEW_PROTECTION_ENABLED_ENV_VAR} enables Vercel skew protection, but {VERCEL_DEPLOYMENT_ID_ENV_VAR} is not set to a deployment ID of one or more visible ASCII characters"
)),
}
}