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::Snafu;
21
22pub type Result<T> = std::result::Result<T, Error>;
23
24#[derive(Snafu)]
25#[snafu(visibility(pub))]
26#[stack_trace_debug]
27pub enum Error {
28 #[snafu(display("Internal error"))]
29 Internal { source: BoxedError },
30
31 #[snafu(display("Memory profiling is not supported"))]
32 ProfilingNotSupported,
33
34 #[snafu(display("Failed to parse jeheap profile: {}", err))]
35 ParseJeHeap {
36 #[snafu(source)]
37 err: anyhow::Error,
38 },
39
40 #[snafu(display("Failed to dump profile data to flamegraph: {}", err))]
41 Flamegraph {
42 #[snafu(source)]
43 err: anyhow::Error,
44 },
45}
46
47impl ErrorExt for Error {
48 fn status_code(&self) -> StatusCode {
49 match self {
50 Error::Internal { source } => source.status_code(),
51 Error::ParseJeHeap { .. } | Error::Flamegraph { .. } => StatusCode::Internal,
52 Error::ProfilingNotSupported => StatusCode::Unsupported,
53 }
54 }
55
56 fn as_any(&self) -> &dyn Any {
57 self
58 }
59}