-
Notifications
You must be signed in to change notification settings - Fork 924
Add external variant to ParquetError (#3285) #3574
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,12 +17,13 @@ | |
|
||
//! Common Parquet errors and macros. | ||
|
||
use std::error::Error; | ||
use std::{cell, io, result, str}; | ||
|
||
#[cfg(feature = "arrow")] | ||
use arrow_schema::ArrowError; | ||
|
||
#[derive(Debug, PartialEq, Clone, Eq)] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The loss of PartialEq / Eq seems like it may cause a fairly major API breakage (if a ParquetError is embedded in another error type, for example) Could we possibly add in a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't have a great idea for Copy other than to add a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I worry that lulls people into a false sense of security, I would rather scream test removal and see if that's ok There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess @alamb means a downstream project may use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hence the scream test 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
What is "false" about the sense of security 😆 ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That we don't actually provide a meaningful PartialEq implementation for a large portion of the errors we produce, I dunno it feels like a strange thing for an error to provide... I've double-checked that DataFusion doesn't provide something similar, neither do any of the other crates in this repo |
||
#[derive(Debug)] | ||
pub enum ParquetError { | ||
/// General Parquet error. | ||
/// Returned when code violates normal workflow of working with Parquet files. | ||
|
@@ -39,66 +40,72 @@ pub enum ParquetError { | |
/// Returned when reading into arrow or writing from arrow. | ||
ArrowError(String), | ||
IndexOutOfBound(usize, usize), | ||
/// An external error variant | ||
External(Box<dyn Error + Send + Sync>), | ||
} | ||
|
||
impl std::fmt::Display for ParquetError { | ||
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { | ||
match *self { | ||
ParquetError::General(ref message) => { | ||
match &self { | ||
ParquetError::General(message) => { | ||
write!(fmt, "Parquet error: {}", message) | ||
} | ||
ParquetError::NYI(ref message) => write!(fmt, "NYI: {}", message), | ||
ParquetError::EOF(ref message) => write!(fmt, "EOF: {}", message), | ||
ParquetError::NYI(message) => write!(fmt, "NYI: {}", message), | ||
ParquetError::EOF(message) => write!(fmt, "EOF: {}", message), | ||
#[cfg(feature = "arrow")] | ||
ParquetError::ArrowError(ref message) => write!(fmt, "Arrow: {}", message), | ||
ParquetError::IndexOutOfBound(ref index, ref bound) => { | ||
ParquetError::ArrowError(message) => write!(fmt, "Arrow: {}", message), | ||
ParquetError::IndexOutOfBound(index, ref bound) => { | ||
write!(fmt, "Index {} out of bound: {}", index, bound) | ||
} | ||
ParquetError::External(e) => write!(fmt, "External: {}", e), | ||
} | ||
} | ||
} | ||
|
||
impl std::error::Error for ParquetError { | ||
fn cause(&self) -> Option<&dyn ::std::error::Error> { | ||
None | ||
impl Error for ParquetError { | ||
fn source(&self) -> Option<&(dyn Error + 'static)> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ❤️ |
||
match self { | ||
ParquetError::External(e) => Some(e.as_ref()), | ||
_ => None, | ||
} | ||
} | ||
} | ||
|
||
impl From<io::Error> for ParquetError { | ||
fn from(e: io::Error) -> ParquetError { | ||
ParquetError::General(format!("underlying IO error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
} | ||
} | ||
|
||
#[cfg(any(feature = "snap", test))] | ||
impl From<snap::Error> for ParquetError { | ||
fn from(e: snap::Error) -> ParquetError { | ||
ParquetError::General(format!("underlying snap error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
} | ||
} | ||
|
||
impl From<thrift::Error> for ParquetError { | ||
fn from(e: thrift::Error) -> ParquetError { | ||
ParquetError::General(format!("underlying Thrift error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
} | ||
} | ||
|
||
impl From<cell::BorrowMutError> for ParquetError { | ||
fn from(e: cell::BorrowMutError) -> ParquetError { | ||
ParquetError::General(format!("underlying borrow error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nice |
||
} | ||
} | ||
|
||
impl From<str::Utf8Error> for ParquetError { | ||
fn from(e: str::Utf8Error) -> ParquetError { | ||
ParquetError::General(format!("underlying utf8 error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
} | ||
} | ||
|
||
#[cfg(feature = "arrow")] | ||
impl From<ArrowError> for ParquetError { | ||
fn from(e: ArrowError) -> ParquetError { | ||
ParquetError::ArrowError(format!("underlying Arrow error: {}", e)) | ||
ParquetError::External(Box::new(e)) | ||
} | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
drive by doc cleanup?