use std::borrow::Cow;
use crate::{error::XmlParserErrors, parser::xml_fatal_err_msg_str};
use super::{XmlParserCtxt, xml_is_letter};
#[doc(alias = "xmlSplitQName")]
pub fn split_qname<'a>(ctxt: &mut XmlParserCtxt, name: &'a str) -> (Option<&'a str>, &'a str) {
if name.starts_with(':') {
return (None, name);
}
let Some((prefix, local)) = name.split_once(':').filter(|qname| !qname.1.is_empty()) else {
return (None, name);
};
if local.starts_with(|c| {
!xml_is_letter(c as u32) && c != '_'
}) {
xml_fatal_err_msg_str!(
ctxt,
XmlParserErrors::XmlNsErrQname,
"Name {} is not XML Namespace compliant\n",
name
);
}
(Some(prefix), local)
}
#[doc(alias = "xmlSplitQName2")]
pub fn split_qname2(name: &str) -> Option<(&str, &str)> {
if name.starts_with(':') {
return None;
}
name.split_once(':')
}
#[doc(alias = "xmlSplitQName3")]
pub fn split_qname3<'a>(name: &'a str, len: &mut usize) -> Option<&'a str> {
if name.starts_with(':') {
return None;
}
let (prefix, local) = name.split_once(':').filter(|qname| !qname.1.is_empty())?;
*len = prefix.len();
Some(local)
}
#[doc(alias = "xmlBuildQName")]
pub fn build_qname<'a>(ncname: &'a str, prefix: Option<&str>) -> Cow<'a, str> {
let Some(prefix) = prefix.filter(|p| !p.is_empty()) else {
return Cow::Borrowed(ncname);
};
Cow::Owned(format!("{prefix}:{ncname}"))
}