use thiserror::Error;
use crate::ids::JobId;
#[derive(Debug, Error)]
pub enum JobError {
#[error("job {0} not found")]
NotFound(JobId),
#[error("invalid state transition for job {id}: cannot {action} when status={status}")]
InvalidTransition {
id: JobId,
status: String,
action: &'static str,
},
#[error("payload validation failed for {kind}: {reason}")]
PayloadInvalid { kind: &'static str, reason: String },
#[error("idempotency conflict on key {0}")]
IdempotencyConflict(String),
#[error(transparent)]
Db(#[from] sqlx::Error),
#[error(transparent)]
Serde(#[from] serde_json::Error),
}
impl JobError {
pub fn kind(&self) -> &'static str {
match self {
JobError::NotFound(_) => "not_found",
JobError::InvalidTransition { .. } => "invalid_transition",
JobError::PayloadInvalid { .. } => "payload_invalid",
JobError::IdempotencyConflict(_) => "idempotency_conflict",
JobError::Db(_) => "db",
JobError::Serde(_) => "serde",
}
}
}