1use std::any::Any;
16
17use common_error::ext::{BoxedError, 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("Failed to open metadata kvbackend"))]
27 OpenMetadataKvBackend {
28 #[snafu(implicit)]
29 location: Location,
30 source: BoxedError,
31 },
32
33 #[snafu(display("External error"))]
34 External {
35 source: BoxedError,
36 #[snafu(implicit)]
37 location: Location,
38 },
39
40 #[snafu(display("Failed to parse url: {}", url))]
41 ParseUrl {
42 url: String,
43 #[snafu(implicit)]
44 location: Location,
45 #[snafu(source)]
46 error: url::ParseError,
47 },
48
49 #[snafu(display("Invalid url scheme: {}", scheme))]
50 InvalidUrlScheme { scheme: String },
51
52 #[snafu(display("Repartition procedure is not supported in standalone mode"))]
53 NoSupportRepartitionProcedure {
54 #[snafu(implicit)]
55 location: Location,
56 },
57}
58
59pub type Result<T> = std::result::Result<T, Error>;
60
61impl ErrorExt for Error {
62 fn status_code(&self) -> StatusCode {
63 match self {
64 Error::OpenMetadataKvBackend { source, .. } => source.status_code(),
65 Error::External { source, .. } => source.status_code(),
66 Error::ParseUrl { .. } => StatusCode::InvalidArguments,
67 Error::InvalidUrlScheme { .. } => StatusCode::InvalidArguments,
68 Error::NoSupportRepartitionProcedure { .. } => StatusCode::Unsupported,
69 }
70 }
71
72 fn as_any(&self) -> &dyn Any {
73 self
74 }
75}