use std::borrow::Cow;
use std::fmt::{Debug, Display, Formatter, Result as FmtResult};
use std::ops::Deref;
use crate::misc::format_utf8_slice;
#[derive(Default, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct Namespace(pub Cow<'static, [u8]>);
impl Namespace {
pub const XS: Self = Self(Cow::Borrowed(b"http://www.w3.org/2001/XMLSchema"));
pub const XSI: Self = Self(Cow::Borrowed(b"http://www.w3.org/2001/XMLSchema-instance"));
pub const XML: Self = Self(Cow::Borrowed(b"http://www.w3.org/XML/1998/namespace"));
}
impl Namespace {
#[must_use]
pub fn new<X>(value: X) -> Self
where
X: Into<Cow<'static, [u8]>>,
{
Self(value.into())
}
#[must_use]
pub const fn new_const(value: &'static [u8]) -> Self {
Self(Cow::Borrowed(value))
}
}
impl AsRef<[u8]> for Namespace {
fn as_ref(&self) -> &[u8] {
&self.0
}
}
impl Deref for Namespace {
type Target = Cow<'static, [u8]>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<X> From<X> for Namespace
where
X: Into<Cow<'static, [u8]>>,
{
fn from(value: X) -> Self {
Self(value.into())
}
}
impl<'x> From<&'x Self> for Namespace {
fn from(value: &'x Self) -> Self {
value.clone()
}
}
impl Debug for Namespace {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
write!(f, "Namespace(b\"")?;
format_utf8_slice(&self.0, f)?;
write!(f, "\")")?;
Ok(())
}
}
impl Display for Namespace {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
format_utf8_slice(&self.0, f)
}
}