use core::fmt;
use crate::operation::PermitContextError;
#[derive(Clone, Copy)]
pub enum PlanFingerprintBuildError<E> {
ReadOnlyOperation,
MissingOperationId,
EndpointNotAdmitted,
NoOp,
Context(PermitContextError),
MissingCost,
UnexpectedCost,
InvalidSingleAttemptBudget,
MissingIdempotency,
UnexpectedIdempotency,
InputTooLarge,
OutputTooSmall,
Hasher(E),
InvalidDigestLength,
}
impl<E> fmt::Debug for PlanFingerprintBuildError<E> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::ReadOnlyOperation => "PlanFingerprintBuildError::ReadOnlyOperation",
Self::MissingOperationId => "PlanFingerprintBuildError::MissingOperationId",
Self::EndpointNotAdmitted => "PlanFingerprintBuildError::EndpointNotAdmitted",
Self::NoOp => "PlanFingerprintBuildError::NoOp",
Self::Context(_) => "PlanFingerprintBuildError::Context",
Self::MissingCost => "PlanFingerprintBuildError::MissingCost",
Self::UnexpectedCost => "PlanFingerprintBuildError::UnexpectedCost",
Self::InvalidSingleAttemptBudget => {
"PlanFingerprintBuildError::InvalidSingleAttemptBudget"
}
Self::MissingIdempotency => "PlanFingerprintBuildError::MissingIdempotency",
Self::UnexpectedIdempotency => "PlanFingerprintBuildError::UnexpectedIdempotency",
Self::InputTooLarge => "PlanFingerprintBuildError::InputTooLarge",
Self::OutputTooSmall => "PlanFingerprintBuildError::OutputTooSmall",
Self::Hasher(_) => "PlanFingerprintBuildError::Hasher([redacted])",
Self::InvalidDigestLength => "PlanFingerprintBuildError::InvalidDigestLength",
})
}
}
impl<E> fmt::Display for PlanFingerprintBuildError<E> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::ReadOnlyOperation => "read-only operation does not accept an execution permit",
Self::MissingOperationId => "plan confirmation requires an operation identifier",
Self::EndpointNotAdmitted => "plan confirmation endpoint is not admitted",
Self::NoOp => "no-op plan cannot receive execution authority",
Self::Context(_) => "plan confirmation context is invalid",
Self::MissingCost => "cost-bearing plan requires price confirmation",
Self::UnexpectedCost => "no-known-cost plan cannot include price authority",
Self::InvalidSingleAttemptBudget => "single-attempt plan must authorize one attempt",
Self::MissingIdempotency => "reconciliation replay requires idempotency identity",
Self::UnexpectedIdempotency => "idempotency identity requires reconciliation replay",
Self::InputTooLarge => "canonical plan confirmation exceeds its size limit",
Self::OutputTooSmall => "plan confirmation output is too small",
Self::Hasher(_) => "plan confirmation hashing failed",
Self::InvalidDigestLength => "plan confirmation digest length is invalid",
})
}
}
impl<E: core::error::Error + 'static> core::error::Error for PlanFingerprintBuildError<E> {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
Self::Context(error) => Some(error),
Self::Hasher(error) => Some(error),
_ => None,
}
}
}
pub(super) fn map_infallible<E>(
error: PlanFingerprintBuildError<core::convert::Infallible>,
) -> PlanFingerprintBuildError<E> {
match error {
PlanFingerprintBuildError::ReadOnlyOperation => {
PlanFingerprintBuildError::ReadOnlyOperation
}
PlanFingerprintBuildError::MissingOperationId => {
PlanFingerprintBuildError::MissingOperationId
}
PlanFingerprintBuildError::EndpointNotAdmitted => {
PlanFingerprintBuildError::EndpointNotAdmitted
}
PlanFingerprintBuildError::NoOp => PlanFingerprintBuildError::NoOp,
PlanFingerprintBuildError::Context(error) => PlanFingerprintBuildError::Context(error),
PlanFingerprintBuildError::MissingCost => PlanFingerprintBuildError::MissingCost,
PlanFingerprintBuildError::UnexpectedCost => PlanFingerprintBuildError::UnexpectedCost,
PlanFingerprintBuildError::InvalidSingleAttemptBudget => {
PlanFingerprintBuildError::InvalidSingleAttemptBudget
}
PlanFingerprintBuildError::MissingIdempotency => {
PlanFingerprintBuildError::MissingIdempotency
}
PlanFingerprintBuildError::UnexpectedIdempotency => {
PlanFingerprintBuildError::UnexpectedIdempotency
}
PlanFingerprintBuildError::InputTooLarge => PlanFingerprintBuildError::InputTooLarge,
PlanFingerprintBuildError::OutputTooSmall => PlanFingerprintBuildError::OutputTooSmall,
PlanFingerprintBuildError::InvalidDigestLength => {
PlanFingerprintBuildError::InvalidDigestLength
}
PlanFingerprintBuildError::Hasher(never) => match never {},
}
}