use std::sync::OnceLock;
const SDK_NAME: &str = "inferadb-rust";
const SDK_VERSION: &str = env!("CARGO_PKG_VERSION");
static USER_AGENT: OnceLock<String> = OnceLock::new();
pub fn user_agent() -> &'static str {
USER_AGENT.get_or_init(|| {
format!(
"{}/{} ({}; {}/{})",
SDK_NAME,
SDK_VERSION,
rust_version(),
os_name(),
std::env::consts::ARCH,
)
})
}
#[allow(dead_code)]
pub fn short_user_agent() -> String {
format!("{}/{}", SDK_NAME, SDK_VERSION)
}
fn rust_version() -> &'static str {
concat!("rust/", env!("CARGO_PKG_RUST_VERSION"))
}
fn os_name() -> &'static str {
match std::env::consts::OS {
"macos" => "darwin",
os => os,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_user_agent_format() {
let ua = user_agent();
assert!(ua.starts_with("inferadb-rust/"));
assert!(ua.contains("rust/"));
assert!(ua.contains(std::env::consts::ARCH));
assert!(ua.contains('('));
assert!(ua.contains(')'));
}
#[test]
fn test_user_agent_cached() {
let ua1 = user_agent();
let ua2 = user_agent();
assert!(std::ptr::eq(ua1, ua2));
}
#[test]
fn test_short_user_agent() {
let short = short_user_agent();
assert!(short.starts_with("inferadb-rust/"));
assert!(!short.contains('('));
}
#[test]
fn test_os_normalization() {
let os = os_name();
assert!(!os.is_empty());
}
}