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
77pub type Result<T, E = Error> = std::result::Result<T, E>;
78
79impl ErrorExt for Error {
80 fn status_code(&self) -> StatusCode {
81 use Error::*;
82
83 match self {
84 FieldTypeMismatch { source, .. } => source.status_code(),
85 SerializeField { .. } | DeserializeField { .. } | IndexEncodeNull { .. } => {
86 StatusCode::InvalidArguments
87 }
88 NotSupportedField { .. } | UnsupportedOperation { .. } => StatusCode::Unsupported,
89 }
90 }
91
92 fn as_any(&self) -> &dyn Any {
93 self
94 }
95}