use crate::{ffi, mem};
pub fn get(name: &str) -> Option<String> {
let (name_ptr, name_len) = mem::host_arg_str(name);
let result = unsafe { ffi::secret_get(name_ptr, name_len) };
unsafe { mem::read_packed_string(result) }
}
pub fn get_bytes(name: &str) -> Option<Vec<u8>> {
let (name_ptr, name_len) = mem::host_arg_str(name);
let result = unsafe { ffi::secret_get(name_ptr, name_len) };
unsafe { mem::read_packed_bytes(result) }
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ffi::test_host;
#[test]
fn get_returns_allowed_secret() {
test_host::reset();
test_host::with_mock(|m| {
m.secrets.insert("api-key".into(), b"sk-12345".to_vec());
});
assert_eq!(get("api-key").as_deref(), Some("sk-12345"));
}
#[test]
fn get_none_for_disallowed_or_missing() {
test_host::reset();
assert!(get("not-allowed").is_none());
}
#[test]
fn get_records_lookup_name() {
test_host::reset();
let _ = get("my-secret");
assert_eq!(
test_host::read_mock(|m| m.last_secret_get.clone()),
Some("my-secret".into())
);
}
#[test]
fn get_bytes_returns_raw() {
test_host::reset();
test_host::with_mock(|m| {
m.secrets
.insert("binary".into(), vec![0xde, 0xad, 0xbe, 0xef]);
});
assert_eq!(get_bytes("binary"), Some(vec![0xde, 0xad, 0xbe, 0xef]));
}
#[test]
fn get_bytes_none_when_denied() {
test_host::reset();
assert!(get_bytes("missing").is_none());
}
}