use anyhow::{Context, Result};
const ENV_TOKEN: &str = "KANADE_NATS_TOKEN";
#[cfg(windows)]
const REG_PATH: &str = r"SOFTWARE\kanade\agent";
#[cfg(windows)]
const REG_VALUE: &str = "NatsToken";
#[cfg(windows)]
fn read_registry_token() -> Option<String> {
use winreg::RegKey;
use winreg::enums::HKEY_LOCAL_MACHINE;
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let key = hklm.open_subkey(REG_PATH).ok()?;
let token: String = key.get_value(REG_VALUE).ok()?;
if token.is_empty() { None } else { Some(token) }
}
#[cfg(not(windows))]
fn read_registry_token() -> Option<String> {
None
}
fn resolve_token() -> Option<String> {
if let Some(t) = read_registry_token() {
return Some(t);
}
match std::env::var(ENV_TOKEN) {
Ok(t) if !t.is_empty() => Some(t),
_ => None,
}
}
pub async fn connect(url: &str) -> Result<async_nats::Client> {
let opts = async_nats::ConnectOptions::new();
let opts = match resolve_token() {
Some(token) => opts.token(token),
None => opts,
};
opts.connect(url)
.await
.with_context(|| format!("connect to NATS at {url}"))
}