diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 0b9d59f..fe37409 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -209,6 +209,7 @@ name = "nix-util" version = "0.1.0" dependencies = [ "anyhow", + "ctor", "nix-c-raw", ] diff --git a/rust/nix-util/Cargo.toml b/rust/nix-util/Cargo.toml index db15880..e323aa3 100644 --- a/rust/nix-util/Cargo.toml +++ b/rust/nix-util/Cargo.toml @@ -8,3 +8,4 @@ edition = "2021" [dependencies] anyhow = "1.0.79" nix-c-raw = { path = "../nix-c-raw" } +ctor = "0.2.7" diff --git a/rust/nix-util/src/lib.rs b/rust/nix-util/src/lib.rs index 0306c93..e1a943b 100644 --- a/rust/nix-util/src/lib.rs +++ b/rust/nix-util/src/lib.rs @@ -1,2 +1,3 @@ pub mod context; +pub mod settings; pub mod string_return; diff --git a/rust/nix-util/src/settings.rs b/rust/nix-util/src/settings.rs new file mode 100644 index 0000000..5abe418 --- /dev/null +++ b/rust/nix-util/src/settings.rs @@ -0,0 +1,71 @@ +use anyhow::Result; +use nix_c_raw as raw; + +use crate::{ + context, + string_return::{callback_get_vec_u8, callback_get_vec_u8_data}, +}; + +pub fn set(key: &str, value: &str) -> Result<()> { + let ctx = context::Context::new(); + let key = std::ffi::CString::new(key)?; + let value = std::ffi::CString::new(value)?; + unsafe { + raw::setting_set(ctx.ptr(), key.as_ptr(), value.as_ptr()); + }; + ctx.check_err() +} + +pub fn get(key: &str) -> Result { + let ctx = context::Context::new(); + let key = std::ffi::CString::new(key)?; + let mut raw_buffer: Vec = Vec::new(); + unsafe { + raw::setting_get( + ctx.ptr(), + key.as_ptr(), + callback_get_vec_u8 as *mut std::ffi::c_void, + callback_get_vec_u8_data(&mut raw_buffer), + ) + }; + ctx.check_err()?; + String::from_utf8(raw_buffer).map_err(|e| e.into()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[ctor::ctor] + fn setup() { + let ctx = context::Context::new(); + unsafe { + nix_c_raw::libstore_init(ctx.ptr()); + }; + ctx.check_err().unwrap(); + } + + #[test] + fn set_get() { + // Something that shouldn't matter if it's a different value temporarily + let key = "user-agent-suffix"; + + // Save the old value, in case it's important. Probably not. + // If this doesn't work, pick a different setting to test with + let old_value = get(key).unwrap(); + + let new_value = "just a string that we're storing into some option for testing purposes"; + + let res_e = (|| { + set(key, new_value)?; + get(key) + })(); + + // Restore immediately; try not to affect other tests (if relevant). + set(key, old_value.as_str()).unwrap(); + + let res = res_e.unwrap(); + + assert_eq!(res, new_value); + } +}