use std::time::Duration;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum WorkflowError {
#[error("event downcast failed: expected {expected}, got {got}")]
EventDowncastFailed {
expected: &'static str,
got: String,
},
#[error("no handler for event type: {event_type}")]
NoHandler {
event_type: String,
},
#[error("workflow timed out after {elapsed:?}")]
Timeout {
elapsed: Duration,
},
#[error("step '{step_name}' failed: {source}")]
StepFailed {
step_name: String,
#[source]
source: Box<dyn std::error::Error + Send + Sync>,
},
#[error("internal channel closed")]
ChannelClosed,
#[error("workflow validation failed: {0}")]
ValidationFailed(String),
#[error("context error: {0}")]
Context(String),
#[error("serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("binary serialization error: {0}")]
BinarySerialization(String),
#[error("workflow paused")]
Paused,
#[error("workflow paused for input: request_id={request_id}")]
InputRequired {
request_id: String,
prompt: String,
metadata: serde_json::Value,
},
#[error("{0}")]
Other(#[from] anyhow::Error),
}
pub type Result<T, E = WorkflowError> = std::result::Result<T, E>;