use std::fmt;
#[derive(Debug, Clone)]
pub enum LcelError {
Provider(String),
Chain(String),
Agent(String),
Graph(String),
Tool(String),
OutputParser(String),
Stream(String),
Pipeline(String),
TypeMismatch(String),
Other(String),
}
impl fmt::Display for LcelError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
LcelError::Provider(msg) => write!(f, "Provider error: {msg}"),
LcelError::Chain(msg) => write!(f, "Chain error: {msg}"),
LcelError::Agent(msg) => write!(f, "Agent error: {msg}"),
LcelError::Graph(msg) => write!(f, "Graph error: {msg}"),
LcelError::Tool(msg) => write!(f, "Tool error: {msg}"),
LcelError::OutputParser(msg) => write!(f, "Output parser error: {msg}"),
LcelError::Stream(msg) => write!(f, "Stream error: {msg}"),
LcelError::Pipeline(msg) => write!(f, "Pipeline error: {msg}"),
LcelError::TypeMismatch(msg) => write!(f, "Type mismatch: {msg}"),
LcelError::Other(msg) => write!(f, "{msg}"),
}
}
}
impl std::error::Error for LcelError {}
impl From<std::convert::Infallible> for LcelError {
fn from(_: std::convert::Infallible) -> Self {
unreachable!()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_formats_correctly() {
assert_eq!(
LcelError::Provider("openai timeout".to_string()).to_string(),
"Provider error: openai timeout"
);
assert_eq!(
LcelError::Chain("missing input".to_string()).to_string(),
"Chain error: missing input"
);
assert_eq!(
LcelError::TypeMismatch("expected String got i32".to_string()).to_string(),
"Type mismatch: expected String got i32"
);
}
#[test]
fn is_send_sync() {
fn assert_send_sync<T: Send + Sync + 'static>() {}
assert_send_sync::<LcelError>();
}
}