use {crate::IdError, std::fmt};
#[derive(Debug, Clone, Copy)]
pub struct IdClass {
prefix: &'static str,
}
impl IdClass {
pub const fn new(prefix: &'static str) -> Self {
assert!(!prefix.is_empty());
Self { prefix }
}
pub fn prefix(self) -> &'static str {
self.prefix
}
pub fn strip_prefix(self, public_id: &str) -> Result<&str, IdError> {
let mut public_id_chars = public_id.chars();
let mut public_prefix_len = 0; for class_char in self.prefix.chars() {
let Some(public_id_char) = public_id_chars.next() else {
return Err(IdError::WrongClass);
};
if !public_id_char.eq_ignore_ascii_case(&class_char) {
return Err(IdError::WrongClass);
}
public_prefix_len += public_id_char.len_utf8();
}
if public_id_chars.next() != Some('_') {
if public_id.contains('_') {
return Err(IdError::WrongClass);
} else {
return Err(IdError::InvalidFormat);
}
}
public_prefix_len += 1;
Ok(&public_id[public_prefix_len..])
}
}
impl fmt::Display for IdClass {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.prefix)
}
}