#[derive(
Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
)]
#[serde(rename_all = "snake_case")]
pub enum TextLengthUnit {
UnicodeScalar,
}
#[inline]
pub fn char_len(value: &str) -> usize {
value.chars().count()
}
#[cfg(test)]
mod tests {
use super::char_len;
#[test]
fn ascii_is_unchanged() {
for value in ["", "a", "hello", "1234567890"] {
assert_eq!(char_len(value), value.len(), "{value:?}");
}
}
#[test]
fn multibyte_scalars_count_once() {
assert_eq!(char_len("a"), 1);
assert_eq!(char_len("Γ©"), 1);
assert_eq!(char_len("ζ±δΊ¬"), 2);
assert_eq!(char_len("π"), 1);
}
#[test]
fn a_combining_sequence_counts_each_scalar() {
let precomposed = "\u{00e9}";
let decomposed = "e\u{0301}";
assert_eq!(char_len(precomposed), 1);
assert_eq!(char_len(decomposed), 2);
assert_eq!((precomposed.len(), decomposed.len()), (2, 3));
}
#[test]
fn an_emoji_sequence_counts_each_scalar() {
assert_eq!(char_len("π¨βπ©βπ§βπ¦"), 7);
}
}