1use std::any::Any;
16
17use common_error::ext::{BoxedError, ErrorExt};
18use common_error::status_code::StatusCode;
19use common_macro::stack_trace_debug;
20use prost::{DecodeError, EncodeError};
21use snafu::{Location, Snafu};
22
23#[derive(Snafu)]
24#[snafu(visibility(pub))]
25#[stack_trace_debug]
26pub enum Error {
27 #[snafu(display("Failed to decode substrait relation"))]
28 DecodeRel {
29 #[snafu(source)]
30 error: DecodeError,
31 #[snafu(implicit)]
32 location: Location,
33 },
34
35 #[snafu(display("Failed to encode substrait relation"))]
36 EncodeRel {
37 #[snafu(source)]
38 error: EncodeError,
39 #[snafu(implicit)]
40 location: Location,
41 },
42
43 #[snafu(display("Internal error"))]
44 Internal {
45 #[snafu(implicit)]
46 location: Location,
47 source: BoxedError,
48 },
49
50 #[snafu(display("Failed to encode DataFusion plan"))]
51 EncodeDfPlan {
52 #[snafu(source)]
53 error: datafusion::error::DataFusionError,
54 #[snafu(implicit)]
55 location: Location,
56 },
57
58 #[snafu(display("Failed to decode DataFusion plan"))]
59 DecodeDfPlan {
60 #[snafu(source)]
61 error: datafusion::error::DataFusionError,
62 #[snafu(implicit)]
63 location: Location,
64 },
65}
66
67pub type Result<T> = std::result::Result<T, Error>;
68
69impl ErrorExt for Error {
70 fn status_code(&self) -> StatusCode {
71 match self {
72 Error::EncodeRel { .. } | Error::DecodeRel { .. } => StatusCode::InvalidArguments,
73 Error::Internal { .. } => StatusCode::Internal,
74 Error::EncodeDfPlan { .. } | Error::DecodeDfPlan { .. } => StatusCode::Unexpected,
75 }
76 }
77
78 fn as_any(&self) -> &dyn Any {
79 self
80 }
81}