use std::sync::atomic::{AtomicBool, Ordering};
use anyhow::{bail, Result};
pub const DEFAULT_HOOK_EMBEDDING_TIMEOUT_SECS: u64 = 2;
pub const ENV_HOOK_EMBEDDING_TIMEOUT_SECS: &str = "REMEM_EMBEDDINGS_HOOK_TIMEOUT_SECS";
static HOOK_RUNTIME_MODE: AtomicBool = AtomicBool::new(false);
pub fn enter_hook_runtime_mode() {
HOOK_RUNTIME_MODE.store(true, Ordering::Relaxed);
}
pub fn hook_runtime_mode() -> bool {
HOOK_RUNTIME_MODE.load(Ordering::Relaxed)
}
pub fn hook_embedding_timeout_secs() -> Result<u64> {
match std::env::var(ENV_HOOK_EMBEDDING_TIMEOUT_SECS) {
Ok(raw) if !raw.trim().is_empty() => parse_hook_timeout_secs(raw.trim()),
_ => Ok(DEFAULT_HOOK_EMBEDDING_TIMEOUT_SECS),
}
}
fn parse_hook_timeout_secs(raw: &str) -> Result<u64> {
match raw.parse::<u64>() {
Ok(secs) if secs > 0 => Ok(secs),
_ => bail!("{ENV_HOOK_EMBEDDING_TIMEOUT_SECS} must be a positive integer, got {raw:?}"),
}
}
#[cfg(test)]
mod tests {
use super::parse_hook_timeout_secs;
#[test]
fn parses_positive_seconds() {
assert_eq!(parse_hook_timeout_secs("1").unwrap(), 1);
assert_eq!(parse_hook_timeout_secs("30").unwrap(), 30);
}
#[test]
fn rejects_zero_and_garbage() {
assert!(parse_hook_timeout_secs("0").is_err());
assert!(parse_hook_timeout_secs("-1").is_err());
assert!(parse_hook_timeout_secs("abc").is_err());
}
}