use thiserror::Error;
#[derive(Debug, Clone)]
pub struct LineError {
pub line: u64,
pub message: String,
pub original_line: Option<String>,
}
impl std::fmt::Display for LineError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "line {}: {}", self.line, self.message)
}
}
#[derive(Debug, Error)]
#[error(
"partial write: {} line(s) rejected; first error: {}",
line_errors.len(),
line_errors.first().map(|e| e.message.as_str()).unwrap_or("unknown")
)]
pub struct PartialWriteError {
pub line_errors: Vec<LineError>,
}
#[derive(Debug, Error)]
pub enum Error {
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("invalid URL: {0}")]
Url(#[from] url::ParseError),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error("Arrow error: {0}")]
Arrow(#[from] arrow::error::ArrowError),
#[error("Flight gRPC error: {0}")]
Flight(#[from] tonic::Status),
#[error("gRPC transport error: {0}")]
Transport(#[from] tonic::transport::Error),
#[error("server error {code}: {message}")]
Server { code: u16, message: String },
#[error("operation timed out after {0:?}")]
Timeout(std::time::Duration),
#[error(transparent)]
PartialWrite(#[from] PartialWriteError),
#[error("configuration error: {0}")]
Config(String),
#[error("environment variable '{0}' is not set")]
EnvVar(String),
}