Skip to main content

cli/data/import_v2/
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 snafu::{Location, Snafu};
21
22#[derive(Snafu)]
23#[snafu(visibility(pub))]
24#[stack_trace_debug]
25pub enum Error {
26    #[snafu(display("Snapshot not found at '{}'", uri))]
27    SnapshotNotFound {
28        uri: String,
29        #[snafu(implicit)]
30        location: Location,
31    },
32
33    #[snafu(display("Manifest version mismatch: expected {}, found {}", expected, found))]
34    ManifestVersionMismatch {
35        expected: u32,
36        found: u32,
37        #[snafu(implicit)]
38        location: Location,
39    },
40
41    #[snafu(display("Schema '{}' not found in snapshot", schema))]
42    SchemaNotInSnapshot {
43        schema: String,
44        #[snafu(implicit)]
45        location: Location,
46    },
47
48    #[snafu(display("Snapshot storage error"))]
49    SnapshotStorage {
50        #[snafu(source)]
51        error: crate::data::export_v2::error::Error,
52        #[snafu(implicit)]
53        location: Location,
54    },
55
56    #[snafu(display("Database error"))]
57    Database {
58        #[snafu(source)]
59        error: crate::error::Error,
60        #[snafu(implicit)]
61        location: Location,
62    },
63}
64
65pub type Result<T> = std::result::Result<T, Error>;
66
67impl ErrorExt for Error {
68    fn status_code(&self) -> StatusCode {
69        match self {
70            Error::SnapshotNotFound { .. } | Error::SchemaNotInSnapshot { .. } => {
71                StatusCode::InvalidArguments
72            }
73            Error::ManifestVersionMismatch { .. } => StatusCode::InvalidArguments,
74            Error::Database { error, .. } => error.status_code(),
75            Error::SnapshotStorage { error, .. } => error.status_code(),
76        }
77    }
78
79    fn as_any(&self) -> &dyn Any {
80        self
81    }
82}