use cuenv_secrets::SecretError;
use std::path::PathBuf;
pub fn onepassword_wasm_path() -> Result<PathBuf, SecretError> {
if let Ok(path) = std::env::var("ONEPASSWORD_WASM_PATH") {
return Ok(PathBuf::from(path));
}
let cache_dir = dirs::cache_dir().ok_or_else(|| SecretError::ResolutionFailed {
name: "onepassword".to_string(),
message: "Could not determine cache directory".to_string(),
})?;
Ok(cache_dir
.join("cuenv")
.join("wasm")
.join("onepassword-core.wasm"))
}
#[must_use]
pub fn onepassword_wasm_available() -> bool {
onepassword_wasm_path().map(|p| p.exists()).unwrap_or(false)
}
pub fn load_onepassword_wasm() -> Result<Vec<u8>, SecretError> {
let path = onepassword_wasm_path()?;
if !path.exists() {
return Err(SecretError::ResolutionFailed {
name: "onepassword".to_string(),
message: format!(
"1Password WASM SDK not found. Run 'cuenv secrets setup onepassword' to download it.\n\
Expected at: {}",
path.display()
),
});
}
std::fs::read(&path).map_err(|e| SecretError::ResolutionFailed {
name: "onepassword".to_string(),
message: format!("Failed to read WASM file: {e}"),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_wasm_path() {
let path = onepassword_wasm_path().unwrap();
if let Ok(env_path) = std::env::var("ONEPASSWORD_WASM_PATH") {
assert_eq!(path, PathBuf::from(env_path));
} else {
assert!(path.to_string_lossy().contains("onepassword-core.wasm"));
}
}
#[test]
fn test_wasm_path_contains_cuenv_directory() {
if std::env::var("ONEPASSWORD_WASM_PATH").is_err() {
let path = onepassword_wasm_path().unwrap();
let path_str = path.to_string_lossy();
assert!(path_str.contains("cuenv"));
assert!(path_str.contains("wasm"));
}
}
#[test]
fn test_wasm_path_is_absolute() {
let path = onepassword_wasm_path().unwrap();
assert!(path.is_absolute(), "WASM path should be absolute");
}
#[test]
fn test_wasm_available_returns_boolean() {
let result = onepassword_wasm_available();
let _ = result;
}
#[test]
fn test_wasm_available_consistency() {
let first = onepassword_wasm_available();
let second = onepassword_wasm_available();
assert_eq!(first, second);
}
#[test]
fn test_load_wasm_missing_file() {
if std::env::var("ONEPASSWORD_WASM_PATH").is_err() {
let result = load_onepassword_wasm();
if let Err(err) = result {
let err_msg = format!("{err:?}");
assert!(
err_msg.contains("WASM SDK not found") || err_msg.contains("not found"),
"Error should mention WASM not found: {err_msg}"
);
}
}
}
#[test]
fn test_wasm_path_file_extension() {
let path = onepassword_wasm_path().unwrap();
let extension = path.extension().and_then(|e| e.to_str());
if std::env::var("ONEPASSWORD_WASM_PATH").is_err() {
assert_eq!(extension, Some("wasm"), "Path should have .wasm extension");
}
}
}