pub const SDK_ID: &str = "rust";
pub fn sdk_version() -> &'static str {
env!("CARGO_PKG_VERSION")
}
pub fn platform() -> &'static str {
if cfg!(target_os = "macos") {
"macos"
} else if cfg!(target_os = "linux") {
"linux"
} else if cfg!(target_os = "windows") {
"windows"
} else {
"unknown"
}
}
const VERSION_MAX: usize = 64;
const PLATFORM_MAX: usize = 32;
const SDK_ID_MAX: usize = 16;
fn clamp(s: &str, max: usize) -> &str {
let mut units = 0;
for (byte_idx, ch) in s.char_indices() {
let next = units + ch.len_utf16();
if next > max {
return &s[..byte_idx];
}
units = next;
}
s
}
pub fn apply(map: &mut serde_json::Map<String, serde_json::Value>, app_version: Option<&str>) {
map.insert(
"sdk_version".into(),
clamp(sdk_version(), VERSION_MAX).into(),
);
map.insert("platform".into(), clamp(platform(), PLATFORM_MAX).into());
map.insert("sdk".into(), clamp(SDK_ID, SDK_ID_MAX).into());
if let Some(av) = app_version {
map.insert("app_version".into(), clamp(av, VERSION_MAX).into());
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn apply_sets_sdk_and_platform_and_optional_app() {
let mut m = serde_json::Map::new();
apply(&mut m, Some("1.2.3"));
assert_eq!(m["sdk_version"], serde_json::json!(sdk_version()));
assert!(m.contains_key("platform"));
assert_eq!(m["sdk"], serde_json::json!("rust"));
assert_eq!(m["app_version"], serde_json::json!("1.2.3"));
let mut m2 = serde_json::Map::new();
apply(&mut m2, None);
assert!(!m2.contains_key("app_version"));
}
#[test]
fn apply_clamps_app_version_to_the_server_cap() {
let mut m = serde_json::Map::new();
apply(&mut m, Some(&"9".repeat(200)));
assert_eq!(m["app_version"].as_str().unwrap().len(), VERSION_MAX);
}
#[test]
fn clamp_respects_char_boundaries() {
let s = "é".repeat(100);
let out = clamp(&s, VERSION_MAX);
assert_eq!(out.chars().count(), VERSION_MAX);
assert!(s.starts_with(out));
}
#[test]
fn clamp_counts_utf16_code_units_like_the_server() {
let s = "😀".repeat(100);
let out = clamp(&s, VERSION_MAX);
assert_eq!(out.encode_utf16().count(), VERSION_MAX);
assert_eq!(out.chars().count(), VERSION_MAX / 2);
assert!(s.starts_with(out));
}
#[test]
fn clamp_rounds_down_when_the_cap_splits_a_pair() {
let s = "😀".repeat(10);
let out = clamp(&s, 5);
assert_eq!(out.encode_utf16().count(), 4);
assert_eq!(out.chars().count(), 2);
}
#[test]
fn clamp_handles_mixed_width_text() {
let s = format!("{}{}", "a".repeat(10), "😀".repeat(50));
let out = clamp(&s, VERSION_MAX);
assert!(out.encode_utf16().count() <= VERSION_MAX);
assert_eq!(out.encode_utf16().count(), VERSION_MAX);
assert!(s.starts_with(out));
}
#[test]
fn built_in_values_are_within_the_caps() {
assert!(sdk_version().len() <= VERSION_MAX);
assert!(SDK_ID.len() <= SDK_ID_MAX);
assert!(platform().len() <= PLATFORM_MAX);
}
}