Skip to content

Commit 5e6ad9e

Browse files
committed
feat: map DataFusionError context chain
1 parent 234cb4d commit 5e6ad9e

File tree

4 files changed

+45
-19
lines changed

4 files changed

+45
-19
lines changed

guests/rust/src/conversion.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,28 @@ use datafusion_udf_wasm_arrow2bytes::{array2bytes, bytes2array, bytes2datatype,
1010
use crate::bindings::exports::datafusion_udf_wasm::udf::types as wit_types;
1111

1212
impl From<DataFusionError> for wit_types::DataFusionError {
13-
fn from(value: DataFusionError) -> Self {
14-
match value {
15-
DataFusionError::NotImplemented(msg) => Self::NotImplemented(msg),
16-
DataFusionError::Internal(msg) => Self::Internal(msg),
17-
DataFusionError::Plan(msg) => Self::Plan(msg),
18-
DataFusionError::Configuration(msg) => Self::Configuration(msg),
19-
DataFusionError::Execution(msg) => Self::Execution(msg),
20-
_ => Self::NotImplemented(format!("serialize error: {value}")),
13+
fn from(e: DataFusionError) -> Self {
14+
use wit_types::DataFusionErrorKind;
15+
16+
let mut e = e;
17+
let mut context_chain = Vec::new();
18+
while let DataFusionError::Context(context, e2) = e {
19+
e = *e2;
20+
context_chain.push(context);
21+
}
22+
23+
let kind = match e {
24+
DataFusionError::NotImplemented(msg) => DataFusionErrorKind::NotImplemented(msg),
25+
DataFusionError::Internal(msg) => DataFusionErrorKind::Internal(msg),
26+
DataFusionError::Plan(msg) => DataFusionErrorKind::Plan(msg),
27+
DataFusionError::Configuration(msg) => DataFusionErrorKind::Configuration(msg),
28+
DataFusionError::Execution(msg) => DataFusionErrorKind::Execution(msg),
29+
_ => DataFusionErrorKind::NotImplemented(format!("serialize error: {e}")),
30+
};
31+
32+
Self {
33+
context: context_chain,
34+
kind,
2135
}
2236
}
2337
}

host/src/conversion.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,22 @@ use crate::bindings::exports::datafusion_udf_wasm::udf::types as wit_types;
1111

1212
impl From<wit_types::DataFusionError> for DataFusionError {
1313
fn from(value: wit_types::DataFusionError) -> Self {
14-
use wit_types::DataFusionError;
15-
16-
match value {
17-
DataFusionError::NotImplemented(msg) => Self::NotImplemented(msg),
18-
DataFusionError::Internal(msg) => Self::Internal(msg),
19-
DataFusionError::Plan(msg) => Self::Plan(msg),
20-
DataFusionError::Configuration(msg) => Self::Configuration(msg),
21-
DataFusionError::Execution(msg) => Self::Execution(msg),
14+
use wit_types::DataFusionErrorKind;
15+
16+
let mut e = match value.kind {
17+
DataFusionErrorKind::NotImplemented(msg) => Self::NotImplemented(msg),
18+
DataFusionErrorKind::Internal(msg) => Self::Internal(msg),
19+
DataFusionErrorKind::Plan(msg) => Self::Plan(msg),
20+
DataFusionErrorKind::Configuration(msg) => Self::Configuration(msg),
21+
DataFusionErrorKind::Execution(msg) => Self::Execution(msg),
22+
};
23+
24+
// context chain is stored "top-level to inner-level", but we assemble the types inner-to-outer
25+
for context in value.context.into_iter().rev() {
26+
e = e.context(context);
2227
}
28+
29+
e
2330
}
2431
}
2532

host/tests/integration_tests/python/runtime/errors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ def foo(x: int) -> int:
237237
insta::assert_snapshot!(
238238
err(CODE).await,
239239
@r#"
240-
This feature is not implemented: serialize error: cannot call function
240+
cannot call function
241241
caused by
242242
Execution error: Traceback (most recent call last):
243243
File "<string>", line 3, in foo
@@ -272,7 +272,7 @@ def foo(x: int) -> int:
272272
insta::assert_snapshot!(
273273
err(CODE).await,
274274
@r#"
275-
This feature is not implemented: serialize error: cannot call function
275+
cannot call function
276276
caused by
277277
Execution error: Traceback (most recent call last):
278278
File "<string>", line 4, in _inner1

wit/world.wit

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ package datafusion-udf-wasm:[email protected];
22

33
interface types {
44
// TODO: add more variants
5-
variant data-fusion-error {
5+
variant data-fusion-error-kind {
66
not-implemented(string),
77
internal(string),
88
plan(string),
99
configuration(string),
1010
execution(string),
1111
}
1212

13+
record data-fusion-error {
14+
context: list<string>,
15+
kind: data-fusion-error-kind,
16+
}
17+
1318
record data-type {
1419
// arrow IPC schema with a single field that contains the datatype
1520
arrow-ipc-schema: list<u8>,

0 commit comments

Comments
 (0)