#[cfg(all(target_has_atomic = "32", not(feature = "std")))]
pub fn id() -> u128 {
use core::sync::atomic::{AtomicU32, Ordering};
static ID_A: AtomicU32 = AtomicU32::new(0);
static ID_B: AtomicU32 = AtomicU32::new(0);
let a = ID_A.fetch_add(1, Ordering::SeqCst);
let b = if a == u32::MAX {
ID_B.fetch_add(1, Ordering::SeqCst)
} else {
ID_B.load(Ordering::SeqCst)
};
a as u128 + b as u128
}
#[cfg(feature = "std")]
pub fn id() -> u128 {
uuid::Uuid::now_v7().as_u128()
}
#[cfg(all(not(target_has_atomic = "32"), not(feature = "std")))]
compile_error!(
"atomic sync for u32 not supported; std not enabled; no fallback implementation for `id`"
);
#[cfg(feature = "std")]
pub fn get_default_model() -> std::sync::Arc<Option<String>> {
let default_model = std::env::var("OPENAI_API_DEFAULT_MODEL").ok();
std::sync::Arc::new(default_model)
}
#[test]
fn id_increments() {
let a = (0..1_000).map(|_| id());
let b = (0..1_000).map(|_| id());
a.zip(b).for_each(|(a, b)| assert!(a < b));
}