mod generated {
include!(concat!(env!("OUT_DIR"), "/special_characters.rs"));
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SpecialCharacter {
Visible(char),
ZeroWidth,
}
#[must_use]
pub fn special_character(name: &str) -> Option<SpecialCharacter> {
match generated::lookup(name)? {
0 => Some(SpecialCharacter::ZeroWidth),
codepoint => char::from_u32(codepoint).map(SpecialCharacter::Visible),
}
}
#[cfg(test)]
mod tests {
use super::{SpecialCharacter, special_character};
#[test]
fn exposes_the_complete_pinned_mandoc_catalog() {
for (name, expected) in [
("at", '@'),
("ga", '`'),
("oq", '‘'),
("->", '→'),
("<-", '←'),
("mu", '×'),
("lB", '['),
("rB", ']'),
("a\"", '˝'),
("'", '´'),
] {
assert_eq!(
special_character(name),
Some(SpecialCharacter::Visible(expected)),
"name={name}"
);
}
assert_eq!(special_character(":"), Some(SpecialCharacter::ZeroWidth));
assert_eq!(special_character("not-a-mandoc-character"), None);
}
}