#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Version {
V10,
V11,
}
#[must_use]
pub(crate) const fn is_xml_char_for(c: char, version: Version) -> bool {
match version {
Version::V10 => is_xml_char(c),
Version::V11 => matches!(c,
'\u{1}'..='\u{D7FF}'
| '\u{E000}'..='\u{FFFD}'
| '\u{10000}'..='\u{10FFFF}'
),
}
}
#[must_use]
const fn is_restricted_char(c: char) -> bool {
matches!(c,
'\u{1}'..='\u{8}' | '\u{B}'..='\u{C}' | '\u{E}'..='\u{1F}'
| '\u{7F}'..='\u{84}' | '\u{86}'..='\u{9F}'
)
}
#[must_use]
pub(crate) const fn is_literal_char_for(c: char, version: Version) -> bool {
match version {
Version::V10 => is_xml_char(c),
Version::V11 => is_xml_char_for(c, version) && !is_restricted_char(c),
}
}
#[must_use]
pub(crate) const fn is_xml_char(c: char) -> bool {
matches!(c,
'\u{9}' | '\u{A}' | '\u{D}'
| '\u{20}'..='\u{D7FF}'
| '\u{E000}'..='\u{FFFD}'
| '\u{10000}'..='\u{10FFFF}'
)
}
pub(crate) fn is_name_start(c: char) -> bool {
matches!(c, 'A'..='Z' | 'a'..='z' | '_' | ':')
|| matches!(c as u32,
0xC0..=0xD6 | 0xD8..=0xF6 | 0xF8..=0x2FF
| 0x370..=0x37D | 0x37F..=0x1FFF | 0x200C..=0x200D
| 0x2070..=0x218F | 0x2C00..=0x2FEF | 0x3001..=0xD7FF
| 0xF900..=0xFDCF | 0xFDF0..=0xFFFD | 0x10000..=0xEFFFF)
}
pub(crate) fn is_name_char(c: char) -> bool {
is_name_start(c)
|| matches!(c, '-' | '.' | '0'..='9')
|| c as u32 == 0xB7
|| matches!(c as u32, 0x300..=0x36F | 0x203F..=0x2040)
}