Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 22 additions & 8 deletions guests/rust/src/conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,28 @@ use datafusion_udf_wasm_arrow2bytes::{array2bytes, bytes2array, bytes2datatype,
use crate::bindings::exports::datafusion_udf_wasm::udf::types as wit_types;

impl From<DataFusionError> for wit_types::DataFusionError {
fn from(value: DataFusionError) -> Self {
match value {
DataFusionError::NotImplemented(msg) => Self::NotImplemented(msg),
DataFusionError::Internal(msg) => Self::Internal(msg),
DataFusionError::Plan(msg) => Self::Plan(msg),
DataFusionError::Configuration(msg) => Self::Configuration(msg),
DataFusionError::Execution(msg) => Self::Execution(msg),
_ => Self::NotImplemented(format!("serialize error: {value}")),
fn from(e: DataFusionError) -> Self {
use wit_types::DataFusionErrorKind;

let mut e = e;
let mut context_chain = Vec::new();
while let DataFusionError::Context(context, e2) = e {
e = *e2;
context_chain.push(context);
}

let kind = match e {
DataFusionError::NotImplemented(msg) => DataFusionErrorKind::NotImplemented(msg),
DataFusionError::Internal(msg) => DataFusionErrorKind::Internal(msg),
DataFusionError::Plan(msg) => DataFusionErrorKind::Plan(msg),
DataFusionError::Configuration(msg) => DataFusionErrorKind::Configuration(msg),
DataFusionError::Execution(msg) => DataFusionErrorKind::Execution(msg),
_ => DataFusionErrorKind::NotImplemented(format!("serialize error: {e}")),
};

Self {
context: context_chain,
kind,
}
}
}
Expand Down
23 changes: 15 additions & 8 deletions host/src/conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,22 @@ use crate::bindings::exports::datafusion_udf_wasm::udf::types as wit_types;

impl From<wit_types::DataFusionError> for DataFusionError {
fn from(value: wit_types::DataFusionError) -> Self {
use wit_types::DataFusionError;

match value {
DataFusionError::NotImplemented(msg) => Self::NotImplemented(msg),
DataFusionError::Internal(msg) => Self::Internal(msg),
DataFusionError::Plan(msg) => Self::Plan(msg),
DataFusionError::Configuration(msg) => Self::Configuration(msg),
DataFusionError::Execution(msg) => Self::Execution(msg),
use wit_types::DataFusionErrorKind;

let mut e = match value.kind {
DataFusionErrorKind::NotImplemented(msg) => Self::NotImplemented(msg),
DataFusionErrorKind::Internal(msg) => Self::Internal(msg),
DataFusionErrorKind::Plan(msg) => Self::Plan(msg),
DataFusionErrorKind::Configuration(msg) => Self::Configuration(msg),
DataFusionErrorKind::Execution(msg) => Self::Execution(msg),
};

// context chain is stored "top-level to inner-level", but we assemble the types inner-to-outer
for context in value.context.into_iter().rev() {
e = e.context(context);
}

e
}
}

Expand Down
4 changes: 2 additions & 2 deletions host/tests/integration_tests/python/runtime/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ def foo(x: int) -> int:
insta::assert_snapshot!(
err(CODE).await,
@r#"
This feature is not implemented: serialize error: cannot call function
cannot call function
caused by
Execution error: Traceback (most recent call last):
File "<string>", line 3, in foo
Expand Down Expand Up @@ -272,7 +272,7 @@ def foo(x: int) -> int:
insta::assert_snapshot!(
err(CODE).await,
@r#"
This feature is not implemented: serialize error: cannot call function
cannot call function
caused by
Execution error: Traceback (most recent call last):
File "<string>", line 4, in _inner1
Expand Down
7 changes: 6 additions & 1 deletion wit/world.wit
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@ package datafusion-udf-wasm:[email protected];

interface types {
// TODO: add more variants
variant data-fusion-error {
variant data-fusion-error-kind {
not-implemented(string),
internal(string),
plan(string),
configuration(string),
execution(string),
}

record data-fusion-error {
context: list<string>,
kind: data-fusion-error-kind,
}

record data-type {
// arrow IPC schema with a single field that contains the datatype
arrow-ipc-schema: list<u8>,
Expand Down