use std::sync::atomic::{AtomicUsize, Ordering};
static CONTEXT_USED: AtomicUsize = AtomicUsize::new(0);
static CONTEXT_MAX: AtomicUsize = AtomicUsize::new(0);
pub fn update(used: usize, max: usize) {
CONTEXT_USED.store(used, Ordering::Relaxed);
CONTEXT_MAX.store(max, Ordering::Relaxed);
}
pub fn get() -> (usize, usize) {
(
CONTEXT_USED.load(Ordering::Relaxed),
CONTEXT_MAX.load(Ordering::Relaxed),
)
}
pub fn percentage() -> usize {
let (used, max) = get();
if max == 0 {
return 0;
}
(used * 100) / max
}
pub fn format_footer() -> String {
let (used, max) = get();
if max == 0 {
return String::new();
}
let pct = (used * 100) / max;
format!("context: {}/{} ({}%)", format_k(used), format_k(max), pct)
}
fn format_k(n: usize) -> String {
if n < 1_000 {
format!("{n}")
} else if n < 10_000 {
format!("{:.1}k", n as f64 / 1_000.0)
} else {
format!("{}k", n / 1_000)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_k() {
assert_eq!(format_k(500), "500");
assert_eq!(format_k(4_100), "4.1k");
assert_eq!(format_k(128_000), "128k");
}
#[test]
fn test_percentage() {
assert_eq!((10_000 * 100) / 128_000, 7);
}
#[test]
fn test_percentage_zero_max() {
update(0, 0);
assert_eq!(percentage(), 0);
}
#[test]
fn test_format_footer_with_values() {
let used = 4_100usize;
let max = 128_000usize;
let pct = (used * 100) / max;
let result = format!("context: {}/{} ({}%)", format_k(used), format_k(max), pct);
assert_eq!(result, "context: 4.1k/128k (3%)");
}
#[test]
fn test_format_footer_zero() {
update(0, 0);
assert_eq!(format_footer(), "");
}
}