use core::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct FrameTreatmentSummary {
summary: &'static str,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum FrameTreatmentSummaryValidationError {
BlankSummary,
WhitespacePaddedSummary,
EmbeddedLineBreak,
}
impl fmt::Display for FrameTreatmentSummaryValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::BlankSummary => f.write_str("frame-treatment summary is blank"),
Self::WhitespacePaddedSummary => {
f.write_str("frame-treatment summary has surrounding whitespace")
}
Self::EmbeddedLineBreak => f.write_str("frame-treatment summary contains a line break"),
}
}
}
impl std::error::Error for FrameTreatmentSummaryValidationError {}
impl FrameTreatmentSummary {
pub const fn new(summary: &'static str) -> Self {
Self { summary }
}
pub const fn summary_line(self) -> &'static str {
self.summary
}
pub fn validate(&self) -> Result<(), FrameTreatmentSummaryValidationError> {
if self.summary.trim().is_empty() {
Err(FrameTreatmentSummaryValidationError::BlankSummary)
} else if self.summary.trim() != self.summary {
Err(FrameTreatmentSummaryValidationError::WhitespacePaddedSummary)
} else if self.summary.contains('\n') || self.summary.contains('\r') {
Err(FrameTreatmentSummaryValidationError::EmbeddedLineBreak)
} else {
Ok(())
}
}
pub fn validated_summary_line(
&self,
) -> Result<&'static str, FrameTreatmentSummaryValidationError> {
self.validate()?;
Ok(self.summary_line())
}
}
impl fmt::Display for FrameTreatmentSummary {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.summary_line())
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub struct FramePolicySummary {
summary: &'static str,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum FramePolicySummaryValidationError {
BlankSummary,
WhitespacePaddedSummary,
EmbeddedLineBreak,
CurrentPolicyOutOfSync,
}
impl fmt::Display for FramePolicySummaryValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::BlankSummary => f.write_str("frame-policy summary is blank"),
Self::WhitespacePaddedSummary => {
f.write_str("frame-policy summary has surrounding whitespace")
}
Self::EmbeddedLineBreak => f.write_str("frame-policy summary contains a line break"),
Self::CurrentPolicyOutOfSync => {
f.write_str("frame-policy summary is out of sync with the current frame policy")
}
}
}
}
impl std::error::Error for FramePolicySummaryValidationError {}
impl FramePolicySummary {
pub const fn new(summary: &'static str) -> Self {
Self { summary }
}
pub const fn summary_line(self) -> &'static str {
self.summary
}
pub fn validate(&self) -> Result<(), FramePolicySummaryValidationError> {
let current = super::CURRENT_FRAME_POLICY_SUMMARY_TEXT;
if self.summary.trim().is_empty() {
Err(FramePolicySummaryValidationError::BlankSummary)
} else if self.summary.trim() != self.summary {
Err(FramePolicySummaryValidationError::WhitespacePaddedSummary)
} else if self.summary.contains('\n') || self.summary.contains('\r') {
Err(FramePolicySummaryValidationError::EmbeddedLineBreak)
} else if self.summary != current {
Err(FramePolicySummaryValidationError::CurrentPolicyOutOfSync)
} else {
Ok(())
}
}
pub fn validated_summary_line(
&self,
) -> Result<&'static str, FramePolicySummaryValidationError> {
self.validate()?;
Ok(self.summary_line())
}
}
impl fmt::Display for FramePolicySummary {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.summary_line())
}
}