diff --git a/nixide/src/nix_settings.rs b/nixide/src/nix_settings.rs new file mode 100644 index 0000000..e69de29 diff --git a/nixide/src/verbosity.rs b/nixide/src/verbosity.rs index fb1918b..a740027 100644 --- a/nixide/src/verbosity.rs +++ b/nixide/src/verbosity.rs @@ -1,4 +1,7 @@ +use crate::errors::ErrorContext; use crate::sys; +use crate::util::wrappers::AsInnerPtr as _; +use crate::util::{panic_issue, panic_issue_call_failed, wrap}; /// Verbosity level /// @@ -28,7 +31,46 @@ impl From for NixVerbosity { sys::nix_verbosity_NIX_LVL_CHATTY => NixVerbosity::Chatty, sys::nix_verbosity_NIX_LVL_DEBUG => NixVerbosity::Debug, sys::nix_verbosity_NIX_LVL_VOMIT => NixVerbosity::Vomit, - _ => panic!("nixide encountered unknown `nix_verbosity` value, please submit this as an issue at https://github.com/cry128/nixide"), + value => panic_issue!( + "nixide encountered unknown `nix_verbosity` value ({})", + value + ), } } } + +impl Into for NixVerbosity { + fn into(self) -> sys::nix_verbosity { + self as sys::nix_verbosity + } +} + +/// Sets the verbosity level. +/// +/// **This function should never fail!** +/// A panic would indicate a bug in nixide itself. +/// +/// # Nix C++ API Internals +/// +/// ```cpp +/// nix_err nix_set_verbosity(nix_c_context * context, nix_verbosity level) +/// { +/// if (context) +/// context->last_err_code = NIX_OK; +/// if (level > NIX_LVL_VOMIT || level < NIX_LVL_ERROR) +/// return nix_set_err_msg(context, NIX_ERR_UNKNOWN, "Invalid verbosity level"); +/// try { +/// nix::verbosity = static_cast(level); +/// } catch (...) { +/// return nix_context_error(context); +/// } +/// return NIX_OK; +/// } +/// ``` +/// +pub fn set_verbosity(level: NixVerbosity) { + wrap::nix_fn!(|ctx: &ErrorContext| unsafe { + sys::nix_set_verbosity(ctx.as_ptr(), level.into()); + }) + .unwrap_or_else(|err| panic_issue_call_failed!("{}", err)) +}