#[repr(transparent)]
pub struct StructuredDataName(ArrayVec<PrintableAsciiCharacter, 32>);
impl Deref for StructuredDataName
{
type Target = [PrintableAsciiCharacter];
#[inline(always)]
fn deref(&self) -> &Self::Target
{
&self.0[..]
}
}
impl StructuredDataName
{
#[inline(always)]
fn private(name: &[u8], private_enterprise_number: &PrivateEnterpriseNumber) -> Result<Self, PrintableAsciiCharacterPushError>
{
let mut inner = ArrayVec::new();
Self::push_raw_slice(name, &mut inner)?;
PrintableAsciiCharacter(b'@').push_into_array_vec(&mut inner)?;
let a = private_enterprise_number.private_enterprise_number.unpadded_decimal();
Self::push_raw_slice(&a[..], &mut inner)?;
Ok(Self(inner))
}
#[inline(always)]
fn iana_registered(name: &[u8]) -> Self
{
Self::name(name).expect("IANA names should not be invalid")
}
#[inline(always)]
fn name(name: &[u8]) -> Result<Self, PrintableAsciiCharacterPushError>
{
let mut inner = ArrayVec::new();
Self::push_raw_slice(name, &mut inner)?;
Ok(Self(inner))
}
#[inline(always)]
fn push_raw_slice(raw_slice: &[u8], inner: &mut ArrayVec<PrintableAsciiCharacter, 32>) -> Result<(), PrintableAsciiCharacterPushError>
{
lazy_static!
{
static ref Denied: HashSet<u8> = fast_secure_hash_set!
{
b'=',
b']',
b'"',
};
}
PrintableAsciiCharacter::push_raw_slice_into_array_vec_with_additional_restrictions(raw_slice, inner, &Denied)?;
Ok(())
}
}