index/bloom_filter/
error.rs1use 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("IO error"))]
27 Io {
28 #[snafu(source)]
29 error: std::io::Error,
30 #[snafu(implicit)]
31 location: Location,
32 },
33
34 #[snafu(display("Failed to decode protobuf"))]
35 DecodeProto {
36 #[snafu(source)]
37 error: prost::DecodeError,
38 #[snafu(implicit)]
39 location: Location,
40 },
41
42 #[snafu(display("Intermediate error"))]
43 Intermediate {
44 source: crate::error::Error,
45 #[snafu(implicit)]
46 location: Location,
47 },
48
49 #[snafu(display("File size too small for bloom filter"))]
50 FileSizeTooSmall {
51 size: u64,
52 #[snafu(implicit)]
53 location: Location,
54 },
55
56 #[snafu(display("Unexpected bloom filter meta size"))]
57 UnexpectedMetaSize {
58 max_meta_size: u64,
59 actual_meta_size: u64,
60 #[snafu(implicit)]
61 location: Location,
62 },
63
64 #[snafu(display("Invalid intermediate magic"))]
65 InvalidIntermediateMagic {
66 invalid: Vec<u8>,
67 #[snafu(implicit)]
68 location: Location,
69 },
70
71 #[snafu(display("External error"))]
72 External {
73 source: BoxedError,
74 #[snafu(implicit)]
75 location: Location,
76 },
77}
78
79impl ErrorExt for Error {
80 fn status_code(&self) -> StatusCode {
81 use Error::*;
82
83 match self {
84 Io { .. }
85 | FileSizeTooSmall { .. }
86 | UnexpectedMetaSize { .. }
87 | DecodeProto { .. }
88 | InvalidIntermediateMagic { .. } => StatusCode::Unexpected,
89
90 Intermediate { source, .. } => source.status_code(),
91 External { source, .. } => source.status_code(),
92 }
93 }
94
95 fn as_any(&self) -> &dyn Any {
96 self
97 }
98}
99
100pub type Result<T> = std::result::Result<T, Error>;