use std::fmt::Debug;
use std::fmt::Display;
use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use super::ViolationCodeError;
use crate::internal::DottedIdentifierError;
use crate::internal::validate_dotted_identifier;
#[derive(Clone, Copy, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub struct ViolationCode(
&'static str,
);
impl ViolationCode {
#[must_use]
#[inline]
pub const fn new(value: &'static str) -> Self {
match Self::try_new(value) {
Ok(code) => code,
Err(_) => panic!("invalid violation code"),
}
}
#[inline]
pub const fn try_new(value: &'static str) -> Result<Self, ViolationCodeError> {
match validate_dotted_identifier(value) {
Ok(()) => Ok(Self(value)),
Err(DottedIdentifierError::Empty) => Err(ViolationCodeError::Empty),
Err(DottedIdentifierError::EmptySegment) => Err(ViolationCodeError::EmptySegment),
Err(DottedIdentifierError::InvalidSegment) => Err(ViolationCodeError::InvalidSegment),
}
}
#[must_use]
#[inline]
pub const fn as_str(self) -> &'static str {
self.0
}
}
impl Debug for ViolationCode {
fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
formatter.debug_tuple("ViolationCode").field(&self.0).finish()
}
}
impl Display for ViolationCode {
fn fmt(&self, formatter: &mut Formatter<'_>) -> FmtResult {
formatter.write_str(self.0)
}
}