1use common_error::ext::{BoxedError, ErrorExt};
16use common_error::status_code::StatusCode;
17use common_macro::stack_trace_debug;
18use snafu::{Location, Snafu};
19
20#[derive(Snafu)]
21#[snafu(visibility(pub))]
22#[stack_trace_debug]
23pub enum Error {
24 #[snafu(display("External error"))]
25 External {
26 #[snafu(implicit)]
27 location: Location,
28 source: BoxedError,
29 },
30
31 #[snafu(display("Failed to list nodes from metasrv"))]
32 Meta {
33 source: Box<meta_client::error::Error>,
34 #[snafu(implicit)]
35 location: Location,
36 },
37
38 #[snafu(display("Failed to parse process id: {}", s))]
39 ParseProcessId {
40 s: String,
41 #[snafu(implicit)]
42 location: Location,
43 },
44
45 #[snafu(display("Failed to invoke frontend service"))]
46 InvokeFrontend {
47 #[snafu(source)]
48 error: tonic::Status,
49 #[snafu(implicit)]
50 location: Location,
51 },
52
53 #[snafu(display("Failed to invoke list process service"))]
54 CreateChannel {
55 source: common_grpc::error::Error,
56 #[snafu(implicit)]
57 location: Location,
58 },
59}
60
61pub type Result<T> = std::result::Result<T, Error>;
62
63impl ErrorExt for Error {
64 fn status_code(&self) -> StatusCode {
65 use Error::*;
66 match self {
67 External { source, .. } => source.status_code(),
68 Meta { source, .. } => source.status_code(),
69 ParseProcessId { .. } => StatusCode::InvalidArguments,
70 InvokeFrontend { .. } => StatusCode::Unexpected,
71 CreateChannel { source, .. } => source.status_code(),
72 }
73 }
74
75 fn as_any(&self) -> &dyn std::any::Any {
76 self
77 }
78}