use std::path::Path;
use crate::error::Error;
use crate::vault::Vault;
pub fn parse_sandbox_profile(profile: Option<&str>) -> Result<crate::sandbox::SandboxTier, Error> {
let name = profile.unwrap_or("standard");
crate::sandbox::SandboxTier::parse(name).map_err(|bad| {
Error::CryptoFailure(format!(
"invalid sandbox profile '{bad}' (expected: standard|hardened|lockdown)"
))
})
}
#[must_use]
pub fn sandbox_summary(tier: crate::sandbox::SandboxTier) -> &'static str {
tier.as_str()
}
pub fn supervised_execute(
secret_name: &str,
env_var: &str,
command: &[String],
tier: crate::sandbox::SandboxTier,
) -> Result<crate::supervisor::SupervisedResult, Error> {
let vault = Vault::open_default()?;
crate::supervisor::supervised_execute(&vault, secret_name, env_var, command, tier)
}
pub fn print_dataflow_report(result: &crate::supervisor::SupervisedResult, secret_name: &str) {
crate::supervisor::print_dataflow_report(result, secret_name);
}
pub fn inject(secret_name: &str, env_var: &str, command: &[String]) -> Result<(), Error> {
let vault = Vault::open_default()?;
let request = crate::inject::InjectRequest {
secret_name,
env_var,
command,
};
crate::inject::execute(&vault, &request)
}
pub fn inject_multi(mappings: &[(&str, &str)], command: &[String]) -> Result<(), Error> {
let vault = Vault::open_default()?;
crate::inject::execute_multi(&vault, mappings, command)
}
pub fn inject_file(file_path: &Path, command: &[String]) -> Result<(), Error> {
let mappings = crate::envseal_file::parse_envseal_file(file_path)?;
if mappings.is_empty() {
return Err(Error::CryptoFailure(format!(
"no mappings found in {}",
file_path.display()
)));
}
let mapping_refs: Vec<(&str, &str)> = mappings
.iter()
.map(|m| (m.secret_name.as_str(), m.env_var.as_str()))
.collect();
inject_multi(&mapping_refs, command)
}
#[derive(Debug, Clone)]
pub struct EnvsealMapping {
pub env_var: String,
pub secret_name: String,
}
pub fn discover_envseal_mappings(cwd: &Path) -> Result<Option<Vec<EnvsealMapping>>, Error> {
Ok(
crate::envseal_file::discover_and_load(cwd)?.map(|mappings| {
mappings
.into_iter()
.map(|m| EnvsealMapping {
env_var: m.env_var,
secret_name: m.secret_name,
})
.collect()
}),
)
}
pub fn run_with_envseal(cwd: &Path, command: &[String]) -> Result<usize, Error> {
let Some(mappings) = discover_envseal_mappings(cwd)? else {
return Err(Error::SecretNotFound(
".envseal file (run `envseal init` to scaffold one, or use \
`envseal inject` / `envseal inject-file` explicitly)"
.to_string(),
));
};
if mappings.is_empty() {
return Err(Error::SecretNotFound(
".envseal file has no mappings".to_string(),
));
}
let count = mappings.len();
let refs: Vec<(&str, &str)> = mappings
.iter()
.map(|m| (m.secret_name.as_str(), m.env_var.as_str()))
.collect();
inject_multi(&refs, command)?;
Ok(count)
}
pub fn pipe(secret_name: &str, command: &[String]) -> Result<(), Error> {
crate::execution::pipe::pipe(secret_name, command)
}
pub fn pipe_with_stdio_isolation(
secret_name: &str,
command: &[String],
isolate_stdio: bool,
) -> Result<(), Error> {
crate::execution::pipe::pipe_with_stdio_isolation(secret_name, command, isolate_stdio)
}
pub fn pipe_with_stdio_isolation_capture(
secret_name: &str,
command: &[String],
isolate_stdio: bool,
) -> Result<i32, Error> {
crate::execution::pipe::pipe_with_stdio_isolation_capture(secret_name, command, isolate_stdio)
}