pb_mapper_client/client/
error.rs1use std::time::Duration;
2
3use snafu::Snafu;
4
5use pb_mapper_core as common;
8
9#[derive(Debug, Snafu)]
10#[snafu(visibility(pub(super)))]
11pub enum Error {
12 #[snafu(display("bind local listener error"))]
13 BindLocalListener { source: std::io::Error },
14 #[snafu(display("accept local listener error"))]
15 AcceptLocalStream { source: std::io::Error },
16 #[snafu(display("connect remote stream error"))]
17 ConnectRemoteStream { source: std::io::Error },
18 #[snafu(display("encode subcribe request error"))]
19 EncodeSubcribeReq { source: common::error::Error },
20 #[snafu(display("encode status request error"))]
21 EncodeStatusReq { source: common::error::Error },
22 #[snafu(display("write status request error"))]
23 WriteStatusReq { source: common::error::Error },
24 #[snafu(display("decode status response error"))]
25 DecodeStatusResp { source: common::error::Error },
26 #[snafu(display("we expected `PbConnResponse::Status`,but actual response is `{resp}`"))]
27 StatusRespNotMatch {
28 resp: String,
30 },
31 #[snafu(display("relay refused the status request: {code}: {message}"))]
38 StatusRemoteError {
39 code: String,
40 message: String,
41 retryable: bool,
42 },
43 #[snafu(display("write subcribe request error"))]
44 WriteSubcribeReq { source: common::error::Error },
45 #[snafu(display("decode subcribe response error"))]
46 DecodeSubcribeResp { source: common::error::Error },
47 #[snafu(display("we expected `PbConnResponse::Subcribe`,but actual response is `{resp}`"))]
48 SubcribeRespNotMatch {
49 resp: String,
51 },
52 #[snafu(display("relay refused subscription: {code}: {message}"))]
53 SubscribeRemoteError {
54 code: String,
55 message: String,
56 retryable: bool,
57 },
58 #[snafu(display("header msg tool:`{action}` create failed!"))]
59 CreateHeaderTool {
60 action: &'static str,
62 source: common::error::Error,
63 },
64 #[snafu(display("control io `{action}` timed out after {timeout:?}"))]
65 ControlIoTimeout {
66 action: &'static str,
67 timeout: Duration,
68 },
69}
70
71impl Error {
72 pub fn remote_retryable(&self) -> Option<bool> {
78 match self {
79 Self::StatusRemoteError { retryable, .. } => Some(*retryable),
80 _ => None,
81 }
82 }
83}
84
85pub type Result<T, E = Error> = std::result::Result<T, E>;