#[derive(thiserror::Error, Debug)]
pub enum ClientError {
#[error("Failed to connect to orchestrator at {url}: {source}")]
Connection {
url: String,
#[source]
source: Box<dyn std::error::Error + Send + Sync>,
},
#[error("gRPC error: {0}")]
Grpc(#[from] tonic::Status),
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("Invalid response: {0}")]
InvalidResponse(String),
#[error("Local orchestrator error: {0}")]
LocalServer(String),
}
#[derive(thiserror::Error, Debug)]
pub enum BuilderError {
#[error("Output expression not set — call .output() before .build()")]
OutputNotSet,
#[error("Duplicate step ID: {0}")]
DuplicateStep(String),
}
pub type ClientResult<T> = Result<T, ClientError>;
pub type BuilderResult<T> = Result<T, BuilderError>;