use super::RenderError;
use crate::bounded::{Bounded, Overflow};
use crate::diagnostic::{
Family, LineBody, Observed, Phase, RENDERING_FAMILY, REPAIR_LIMIT, RefusalClass, Refused,
RenderedMagnitude, Repair,
};
use core::fmt;
impl RenderError {
#[must_use]
pub const fn slot(&self) -> u8 {
match self {
Self::NothingRendered => 1,
Self::SeatUnplanned { .. } => 2,
Self::BytesUnbounded { .. } => 3,
Self::UnitsUnbounded { .. } => 4,
Self::TokensUnbounded { .. } => 5,
}
}
}
impl fmt::Display for RenderError {
fn fmt(&self, into: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NothingRendered => into.write_str("the renderer materialized no unit at all"),
Self::SeatUnplanned { role } => write!(
into,
"a unit was rendered under the seat {role}, which this plan declares no member for"
),
Self::BytesUnbounded {
role,
bound,
observed,
} => write!(
into,
"the unit rendered under the seat {role} passed {}: {observed} offered where {bound} are declared",
RenderedMagnitude::RenderedBytes.described()
),
Self::UnitsUnbounded { bound, observed } => write!(
into,
"the rendering passed {}: {observed} offered where {bound} are declared",
RenderedMagnitude::RenderedUnits.described()
),
Self::TokensUnbounded { bound, observed } => write!(
into,
"a generated tree passed {}: {observed} offered where {bound} are declared",
RenderedMagnitude::GeneratedTokens.described()
),
}
}
}
impl core::error::Error for RenderError {}
impl From<Overflow> for RenderError {
fn from(overflow: Overflow) -> Self {
Self::TokensUnbounded {
bound: overflow.capacity,
observed: overflow.offered,
}
}
}
impl Refused for RenderError {
const PHASE: Phase = Phase::Rendering;
const FAMILY: Family = RENDERING_FAMILY;
fn class(&self) -> RefusalClass {
match self {
Self::NothingRendered | Self::SeatUnplanned { .. } => {
RefusalClass::RenderingNotProduced
}
Self::BytesUnbounded { .. }
| Self::UnitsUnbounded { .. }
| Self::TokensUnbounded { .. } => RefusalClass::MagnitudeNotHeld,
}
}
fn first(&self) -> String {
self.to_string()
}
fn observed(&self) -> Observed {
match self {
Self::NothingRendered => Observed::SeatAbsent,
Self::SeatUnplanned { .. } => Observed::ContractDisagreement,
Self::BytesUnbounded { .. }
| Self::UnitsUnbounded { .. }
| Self::TokensUnbounded { .. } => Observed::BoundExceeded,
}
}
fn body(&self) -> LineBody {
LineBody::SingleCause
}
fn related(&self) -> Vec<Vec<u8>> {
Vec::new()
}
fn repairs(&self) -> Bounded<Repair, REPAIR_LIMIT> {
Bounded::empty()
}
}