use crate::util::Utf16String;
use super::{ElementName, ElementNameError, ElementNameKind};
pub struct TextElementName {
element_name: ElementName,
complete_namespaced_element_name: Utf16String,
}
impl TextElementName {
pub(super) fn for_name(
prefix: Option<Utf16String>,
element_name: Option<Utf16String>,
) -> Result<Self, ElementNameError> {
let raw_element_name = element_name
.as_ref()
.ok_or(ElementNameError::InvalidElementName)?;
let has_prefix = prefix.as_ref().is_some_and(|value| !value.is_empty());
let complete_namespaced_element_name = if has_prefix {
let prefix_value = prefix.as_ref().expect("checked non-null prefix");
let mut complete = prefix_value.as_utf16().to_vec();
complete.push(u16::from(b':'));
complete.extend_from_slice(raw_element_name.as_utf16());
Utf16String::from_utf16(complete)
} else {
raw_element_name.clone()
};
let base = ElementName::new(
ElementNameKind::Text,
prefix,
element_name,
vec![Some(complete_namespaced_element_name.clone())],
)?;
Ok(Self {
element_name: base,
complete_namespaced_element_name,
})
}
#[must_use]
pub const fn as_element_name(&self) -> &ElementName {
&self.element_name
}
#[must_use]
pub const fn get_complete_namespaced_element_name(&self) -> &Utf16String {
&self.complete_namespaced_element_name
}
}