use crate::{id::NameId, Error, NamespaceId, PrefixId, Xot};
use super::owned::parse_full_name;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CreateName {
name_id: NameId,
}
impl CreateName {
#[inline]
pub(crate) fn new(name_id: NameId) -> Self {
Self { name_id }
}
#[inline]
pub fn name(xot: &mut Xot, local_name: &str) -> Self {
let name_id = xot.add_name(local_name);
Self { name_id }
}
#[inline]
pub fn namespaced(xot: &mut Xot, local_name: &str, namespace: &CreateNamespace) -> Self {
let name_id = xot.add_name_ns(local_name, namespace.namespace_id());
Self { name_id }
}
pub fn prefixed(
xot: &mut Xot,
prefix: &str,
local_name: &str,
lookup_namespace: impl Fn(&str) -> Option<NamespaceId>,
) -> Result<Self, Error> {
let namespace =
lookup_namespace(prefix).ok_or_else(|| Error::UnknownPrefix(prefix.to_string()))?;
let name_id = xot.add_name_ns(local_name, namespace);
Ok(Self { name_id })
}
pub fn parse_full_name(
xot: &mut Xot,
full_name: &str,
lookup_namespace: impl Fn(&str) -> Option<NamespaceId>,
) -> Result<Self, Error> {
let (prefix, local_name) = parse_full_name(full_name);
Self::prefixed(xot, prefix, local_name, lookup_namespace)
}
#[inline]
pub fn name_id(&self) -> NameId {
self.name_id
}
}
impl From<CreateName> for NameId {
#[inline]
fn from(name: CreateName) -> Self {
name.name_id
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CreateNamespace {
pub(crate) prefix_id: PrefixId,
pub(crate) namespace_id: NamespaceId,
}
impl CreateNamespace {
#[inline]
pub fn new(xot: &mut Xot, prefix: &str, namespace: &str) -> Self {
let prefix_id = xot.add_prefix(prefix);
let namespace_id = xot.add_namespace(namespace);
CreateNamespace {
prefix_id,
namespace_id,
}
}
#[inline]
pub fn prefix_id(&self) -> PrefixId {
self.prefix_id
}
#[inline]
pub fn namespace_id(&self) -> NamespaceId {
self.namespace_id
}
}