use std::io;
use thiserror::Error;
use crate::configuration::ConfigurationError;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ReportingError {
#[error(transparent)]
Configuration(#[from] ConfigurationError),
#[error("another progress reporter already owns the process terminal")]
TerminalAlreadyOwned,
#[error("task count {task_count} exceeds this platform's addressable progress slots")]
TaskCountTooLarge {
task_count: u64,
},
#[error("task identity repeats parameter key `{key}`")]
DuplicateIdentityParameter {
key: String,
},
#[error("task identity parameter `{key}` is not declared by the project")]
UnknownIdentityParameter {
key: String,
},
#[error(
"task identity `{identity}` is shared by ordinals {first_ordinal} and {second_ordinal}"
)]
NonUniqueTaskIdentity {
identity: String,
first_ordinal: u64,
second_ordinal: u64,
},
#[error("task ordinal {task_ordinal} is outside the reporter's task registry")]
UnknownTaskOrdinal {
task_ordinal: u64,
},
#[error("task ordinal {task_ordinal} does not match its registered parameter identity")]
TaskIdentityMismatch {
task_ordinal: u64,
},
#[error("task `{identity}` has already started or reached a terminal status")]
TaskAlreadyStarted {
identity: String,
},
#[error("task `{identity}` starts at iteration {initial}, beyond target {target}")]
InitialIterationBeyondTarget {
identity: String,
initial: u64,
target: u64,
},
#[error("task `{identity}` cannot move progress from iteration {current} back to {attempted}")]
IterationRegressed {
identity: String,
current: u64,
attempted: u64,
},
#[error("task `{identity}` reported iteration {iteration}, beyond target {target}")]
IterationBeyondTarget {
identity: String,
iteration: u64,
target: u64,
},
#[error("task `{identity}` completed at iteration {current}, before target {target}")]
TargetIterationNotReached {
identity: String,
current: u64,
target: u64,
},
#[error("failed to start the centralized terminal reporter")]
StartRenderer {
#[source]
source: io::Error,
},
#[error("the centralized terminal reporter is no longer available")]
RendererUnavailable,
#[error("the centralized terminal reporter panicked")]
RendererPanicked,
#[error(
"cannot report success with {pending} pending, {running} running, and {failed} failed tasks"
)]
IncompleteProgress {
pending: u64,
running: u64,
failed: u64,
},
}