mito_codec/
error.rs

1// Copyright 2023 Greptime Team
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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/// Error definitions for mito encoding.
24#[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        // Box the source to reduce the size of the error.
31        #[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}