|
1 | 1 | use arrow_schema::ArrowError; |
2 | 2 | use deltalake::datafusion::error::DataFusionError; |
3 | | -use deltalake::kernel::Error as KernelError; |
4 | 3 | use deltalake::{errors::DeltaTableError, ObjectStoreError}; |
5 | 4 | use pyo3::exceptions::{ |
6 | 5 | PyException, PyFileNotFoundError, PyIOError, PyNotImplementedError, PyRuntimeError, |
@@ -38,10 +37,14 @@ fn inner_to_py_err(err: DeltaTableError) -> PyErr { |
38 | 37 | // python exceptions |
39 | 38 | DeltaTableError::ObjectStore { source } => object_store_to_py(source, None), |
40 | 39 | DeltaTableError::Kernel { source } => match source { |
41 | | - KernelError::ObjectStore(e) => object_store_to_py(e, Some("Kernel error".to_string())), |
| 40 | + deltalake::kernel::Error::ObjectStore(e) => object_store_to_py(e, Some("Kernel error")), |
42 | 41 | other => DeltaError::new_err(DeltaTableError::Kernel { source: other }.to_string()), |
43 | 42 | }, |
44 | | - |
| 43 | + // delta-kernel-rs error propagation |
| 44 | + DeltaTableError::KernelError(source) => match source { |
| 45 | + delta_kernel::Error::ObjectStore(e) => object_store_to_py(e, Some("Kernel error")), |
| 46 | + other => DeltaError::new_err(DeltaTableError::KernelError(other).to_string()), |
| 47 | + }, |
45 | 48 | DeltaTableError::Io { source } => PyIOError::new_err(source.to_string()), |
46 | 49 |
|
47 | 50 | DeltaTableError::Arrow { source } => arrow_to_py(source), |
@@ -97,36 +100,35 @@ impl<T: Error + 'static> Display for DisplaySourceChain<T> { |
97 | 100 | } |
98 | 101 | } |
99 | 102 |
|
100 | | -fn object_store_to_py(err: ObjectStoreError, source_error: Option<String>) -> PyErr { |
101 | | - if let Some(source_error) = source_error { |
102 | | - PyIOError::new_err( |
103 | | - DisplaySourceChain { |
| 103 | +fn object_store_to_py(err: ObjectStoreError, source_error_name: Option<&str>) -> PyErr { |
| 104 | + match err { |
| 105 | + ObjectStoreError::NotFound { .. } => { |
| 106 | + let mut error = DisplaySourceChain { |
104 | 107 | err, |
105 | | - error_name: format!("{} -> IOError", source_error), |
| 108 | + error_name: "FileNotFoundError".to_string(), |
106 | 109 | } |
107 | | - .to_string(), |
108 | | - ) |
109 | | - } else { |
110 | | - match err { |
111 | | - ObjectStoreError::NotFound { .. } => PyFileNotFoundError::new_err( |
112 | | - DisplaySourceChain { |
113 | | - err, |
114 | | - error_name: "FileNotFoundError".to_string(), |
115 | | - } |
116 | | - .to_string(), |
117 | | - ), |
118 | | - ObjectStoreError::Generic { source, .. } |
119 | | - if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") => |
120 | | - { |
121 | | - DeltaProtocolError::new_err(source.to_string()) |
| 110 | + .to_string(); |
| 111 | + if let Some(source_error_name) = source_error_name { |
| 112 | + error = format!("{} -> {}", source_error_name, error) |
122 | 113 | } |
123 | | - _ => PyIOError::new_err( |
124 | | - DisplaySourceChain { |
125 | | - err, |
126 | | - error_name: "IOError".to_string(), |
127 | | - } |
128 | | - .to_string(), |
129 | | - ), |
| 114 | + PyFileNotFoundError::new_err(error) |
| 115 | + } |
| 116 | + |
| 117 | + ObjectStoreError::Generic { source, .. } |
| 118 | + if source.to_string().contains("AWS_S3_ALLOW_UNSAFE_RENAME") => |
| 119 | + { |
| 120 | + DeltaProtocolError::new_err(source.to_string()) |
| 121 | + } |
| 122 | + _ => { |
| 123 | + let mut error = DisplaySourceChain { |
| 124 | + err, |
| 125 | + error_name: "IOError".to_string(), |
| 126 | + } |
| 127 | + .to_string(); |
| 128 | + if let Some(source_error_name) = source_error_name { |
| 129 | + error = format!("{} -> {}", source_error_name, error) |
| 130 | + } |
| 131 | + PyIOError::new_err(error) |
130 | 132 | } |
131 | 133 | } |
132 | 134 | } |
|
0 commit comments