use std::error::Error;
use std::fmt;
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum NameKind {
Job,
Step,
Parameter,
ExitCode,
}
impl fmt::Display for NameKind {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::Job => "job name",
Self::Step => "step name",
Self::Parameter => "parameter name",
Self::ExitCode => "exit code",
})
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum IdentifierKind {
JobInstance,
JobExecution,
StepExecution,
FlowDecision,
FlowDecisionSequence,
RecoveryDecision,
OperatorRequest,
RetentionAction,
StepPartition,
Failure,
}
impl fmt::Display for IdentifierKind {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(match self {
Self::JobInstance => "job instance",
Self::JobExecution => "job execution",
Self::StepExecution => "step execution",
Self::FlowDecision => "flow decision",
Self::FlowDecisionSequence => "flow decision sequence",
Self::RecoveryDecision => "recovery decision",
Self::OperatorRequest => "operator request",
Self::RetentionAction => "retention action",
Self::StepPartition => "step partition",
Self::Failure => "failure",
})
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum DomainError {
EmptyName {
kind: NameKind,
},
NameTooLong {
kind: NameKind,
max_bytes: usize,
},
NameHasSurroundingWhitespace {
kind: NameKind,
},
NameContainsControl {
kind: NameKind,
character_index: usize,
},
ZeroIdentifier {
kind: IdentifierKind,
},
DuplicateParameter,
ParameterStringTooLong {
max_bytes: usize,
},
InvalidTimestampOrder,
ActiveExecutionHasEndTime,
FinishedExecutionMissingEndTime,
FailedExecutionMissingFailure,
}
impl fmt::Display for DomainError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyName { kind } => write!(formatter, "{kind} must not be empty"),
Self::NameTooLong { kind, max_bytes } => {
write!(formatter, "{kind} exceeds {max_bytes} UTF-8 bytes")
}
Self::NameHasSurroundingWhitespace { kind } => {
write!(formatter, "{kind} has surrounding whitespace")
}
Self::NameContainsControl {
kind,
character_index,
} => write!(
formatter,
"{kind} contains a control character at position {character_index}"
),
Self::ZeroIdentifier { kind } => write!(formatter, "{kind} identifier must be nonzero"),
Self::DuplicateParameter => formatter.write_str("job parameter names must be unique"),
Self::ParameterStringTooLong { max_bytes } => {
write!(
formatter,
"string parameter exceeds {max_bytes} UTF-8 bytes"
)
}
Self::InvalidTimestampOrder => {
formatter.write_str("execution timestamps are out of order")
}
Self::ActiveExecutionHasEndTime => {
formatter.write_str("an active execution cannot have an end timestamp")
}
Self::FinishedExecutionMissingEndTime => {
formatter.write_str("a finished execution requires an end timestamp")
}
Self::FailedExecutionMissingFailure => {
formatter.write_str("a failed execution requires a failure summary")
}
}
}
}
impl Error for DomainError {}