1use std::any::Any;
16
17use common_macro::stack_trace_debug;
18use common_telemetry::common_error::ext::ErrorExt;
19use common_telemetry::common_error::status_code::StatusCode;
20use snafu::{Location, Snafu};
21
22#[derive(Snafu)]
23#[snafu(visibility(pub))]
24#[stack_trace_debug]
25pub enum Error {
26 #[snafu(display("Failed to init backend"))]
27 InitBackend {
28 #[snafu(source)]
29 error: opendal::Error,
30 #[snafu(implicit)]
31 location: Location,
32 },
33
34 #[snafu(display("Failed to build http client"))]
35 BuildHttpClient {
36 #[snafu(implicit)]
37 location: Location,
38 #[snafu(source)]
39 error: reqwest::Error,
40 },
41
42 #[snafu(display("Failed to create directory {}", dir))]
43 CreateDir {
44 dir: String,
45 #[snafu(source)]
46 error: std::io::Error,
47 },
48
49 #[snafu(display("Failed to remove directory {}", dir))]
50 RemoveDir {
51 dir: String,
52 #[snafu(source)]
53 error: std::io::Error,
54 },
55}
56
57pub type Result<T> = std::result::Result<T, Error>;
58
59impl ErrorExt for Error {
60 fn status_code(&self) -> StatusCode {
61 use Error::*;
62 match self {
63 InitBackend { .. } => StatusCode::StorageUnavailable,
64 BuildHttpClient { .. } => StatusCode::Unexpected,
65 CreateDir { .. } | RemoveDir { .. } => StatusCode::Internal,
66 }
67 }
68
69 fn as_any(&self) -> &dyn Any {
70 self
71 }
72}