1use std::any::Any;
16
17use common_error::ext::ErrorExt;
18use common_error::status_code::StatusCode;
19use common_macro::stack_trace_debug;
20use datatypes::prelude::ConcreteDataType;
21use snafu::{Location, Snafu};
22
23#[derive(Snafu)]
25#[snafu(visibility(pub))]
26#[stack_trace_debug]
27pub enum Error {
28 #[snafu(display("Row value mismatches field data type"))]
29 FieldTypeMismatch {
30 #[snafu(source(from(datatypes::error::Error, Box::new)))]
32 source: Box<datatypes::error::Error>,
33 #[snafu(implicit)]
34 location: Location,
35 },
36
37 #[snafu(display("Failed to serialize field"))]
38 SerializeField {
39 #[snafu(source)]
40 error: memcomparable::Error,
41 #[snafu(implicit)]
42 location: Location,
43 },
44
45 #[snafu(display(
46 "Data type: {} does not support serialization/deserialization",
47 data_type,
48 ))]
49 NotSupportedField {
50 data_type: ConcreteDataType,
51 #[snafu(implicit)]
52 location: Location,
53 },
54
55 #[snafu(display("Failed to deserialize field"))]
56 DeserializeField {
57 #[snafu(source)]
58 error: memcomparable::Error,
59 #[snafu(implicit)]
60 location: Location,
61 },
62
63 #[snafu(display("Operation not supported: {}", err_msg))]
64 UnsupportedOperation {
65 err_msg: String,
66 #[snafu(implicit)]
67 location: Location,
68 },
69
70 #[snafu(display("Encode null value"))]
71 IndexEncodeNull {
72 #[snafu(implicit)]
73 location: Location,
74 },
75
76 #[snafu(display("Failed to evaluate filter"))]
77 EvaluateFilter {
78 #[snafu(source(from(common_recordbatch::error::Error, Box::new)))]
79 source: Box<common_recordbatch::error::Error>,
80 #[snafu(implicit)]
81 location: Location,
82 },
83}
84
85pub type Result<T, E = Error> = std::result::Result<T, E>;
86
87impl ErrorExt for Error {
88 fn status_code(&self) -> StatusCode {
89 use Error::*;
90
91 match self {
92 FieldTypeMismatch { source, .. } => source.status_code(),
93 SerializeField { .. } | DeserializeField { .. } | IndexEncodeNull { .. } => {
94 StatusCode::InvalidArguments
95 }
96 NotSupportedField { .. } | UnsupportedOperation { .. } => StatusCode::Unsupported,
97 EvaluateFilter { source, .. } => source.status_code(),
98 }
99 }
100
101 fn as_any(&self) -> &dyn Any {
102 self
103 }
104}