#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GenericFamily {
Monospace,
SansSerif,
SystemUi,
}
impl GenericFamily {
pub fn parse(token: &str) -> Option<Self> {
match token.trim().to_ascii_lowercase().as_str() {
"monospace" => Some(Self::Monospace),
"sans-serif" | "sans" => Some(Self::SansSerif),
"system-ui" => Some(Self::SystemUi),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_css_tokens() {
assert_eq!(
GenericFamily::parse("monospace"),
Some(GenericFamily::Monospace)
);
assert_eq!(
GenericFamily::parse("sans-serif"),
Some(GenericFamily::SansSerif)
);
assert_eq!(
GenericFamily::parse("system-ui"),
Some(GenericFamily::SystemUi)
);
}
#[test]
fn parses_pango_aliases_for_the_first_two() {
assert_eq!(
GenericFamily::parse("Monospace"),
Some(GenericFamily::Monospace)
);
assert_eq!(GenericFamily::parse("Sans"), Some(GenericFamily::SansSerif));
}
#[test]
fn pango_has_no_system_ui_alias() {
assert_eq!(GenericFamily::parse("System"), None);
assert_eq!(GenericFamily::parse("SystemUi"), None);
}
#[test]
fn case_and_whitespace_insensitive() {
assert_eq!(
GenericFamily::parse(" MONOSPACE "),
Some(GenericFamily::Monospace)
);
assert_eq!(
GenericFamily::parse("Sans-Serif"),
Some(GenericFamily::SansSerif)
);
assert_eq!(
GenericFamily::parse("System-UI"),
Some(GenericFamily::SystemUi)
);
}
#[test]
fn concrete_family_names_do_not_parse() {
assert_eq!(GenericFamily::parse("Menlo"), None);
assert_eq!(GenericFamily::parse(""), None);
assert_eq!(GenericFamily::parse(" "), None);
assert_eq!(GenericFamily::parse("Segoe UI"), None);
assert_eq!(GenericFamily::parse("SF Pro Text"), None);
}
}