2026-05-20 08:56:49 +02:00
|
|
|
//! Env-var provider.
|
|
|
|
|
//!
|
|
|
|
|
//! This provider is the explicit override path: the configured env var must
|
|
|
|
|
//! contain a concrete executable path. Missing or non-file values are treated
|
|
|
|
|
//! as unresolved so a fallback provider can continue.
|
|
|
|
|
|
|
|
|
|
use std::{env, path::PathBuf};
|
|
|
|
|
|
2026-08-03 17:30:58 +02:00
|
|
|
use async_trait::async_trait;
|
2026-05-20 08:56:49 +02:00
|
|
|
use tracing::{debug, info};
|
|
|
|
|
|
|
|
|
|
use crate::binary::{BinaryProvider, BinaryProviderError, EnvBinaryProvider};
|
|
|
|
|
|
2026-08-03 17:30:58 +02:00
|
|
|
#[async_trait]
|
2026-05-20 08:56:49 +02:00
|
|
|
impl BinaryProvider for EnvBinaryProvider {
|
2026-08-03 17:30:58 +02:00
|
|
|
async fn try_resolve(&self) -> Result<Option<PathBuf>, BinaryProviderError> {
|
2026-05-20 08:56:49 +02:00
|
|
|
let Some(path) = env::var_os(&self.env_var).map(PathBuf::from) else {
|
|
|
|
|
return Ok(None);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if !path.is_file() {
|
|
|
|
|
debug!(
|
|
|
|
|
env = self.env_var,
|
|
|
|
|
path = %path.display(),
|
|
|
|
|
"binary env override does not point to a file"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return Ok(None);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info!(
|
|
|
|
|
env = self.env_var,
|
|
|
|
|
path = %path.display(),
|
|
|
|
|
"resolved binary from env override"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
Ok(Some(path))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn display(&self) -> String {
|
|
|
|
|
"env".to_owned()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn cache_key(&self) -> String {
|
|
|
|
|
format!("env:{}", self.env_var)
|
|
|
|
|
}
|
|
|
|
|
}
|