use super::Tag;
use core::fmt;
#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
pub struct TagNumber(pub u32);
impl TagNumber {
pub(super) const MASK: u8 = 0b11111;
#[deprecated(
since = "0.8.0",
note = "use TagNumber(value) directly as inner field is now pub"
)]
#[must_use]
pub const fn new(value: u32) -> Self {
Self(value)
}
#[must_use]
pub fn application(self, constructed: bool) -> Tag {
Tag::Application {
constructed,
number: self,
}
}
#[must_use]
pub fn context_specific(self, constructed: bool) -> Tag {
Tag::ContextSpecific {
constructed,
number: self,
}
}
#[must_use]
pub fn private(self, constructed: bool) -> Tag {
Tag::Private {
constructed,
number: self,
}
}
#[must_use]
pub fn value(self) -> u32 {
self.0
}
}
impl From<u32> for TagNumber {
fn from(value: u32) -> TagNumber {
TagNumber(value)
}
}
impl From<TagNumber> for u32 {
fn from(number: TagNumber) -> u32 {
number.0
}
}
impl fmt::Display for TagNumber {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[cfg(feature = "arbitrary")]
impl<'a> arbitrary::Arbitrary<'a> for TagNumber {
fn arbitrary(u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
Ok(Self(u.int_in_range(0..=30)?))
}
fn size_hint(depth: usize) -> (usize, Option<usize>) {
u8::size_hint(depth)
}
}