Skip to content

Commit 16677e7

Browse files
committed
api updates
1 parent 4fb0140 commit 16677e7

File tree

4 files changed

+232
-196
lines changed

4 files changed

+232
-196
lines changed

lightning-block-sync/src/convert.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::http::{BinaryResponse, JsonResponse};
1+
use crate::http::{BinaryResponse, HttpClientError, JsonResponse};
2+
#[cfg(feature = "rpc-client")]
3+
use crate::rpc::RpcClientError;
24
use crate::utils::hex_to_work;
35
use crate::{BlockHeaderData, BlockSourceError};
46

@@ -35,6 +37,48 @@ impl From<io::Error> for BlockSourceError {
3537
}
3638
}
3739

40+
/// Conversion from `HttpClientError` into `BlockSourceError`.
41+
impl From<HttpClientError> for BlockSourceError {
42+
fn from(e: HttpClientError) -> BlockSourceError {
43+
match &e {
44+
// Transport errors (connection, timeout, etc.) are transient
45+
HttpClientError::Transport(_) => BlockSourceError::transient(e),
46+
// HTTP non-2xx errors are transient - e.g. "not found" must not stop polling
47+
HttpClientError::Http(_) => BlockSourceError::transient(e),
48+
// I/O errors follow the same logic as std::io::Error
49+
HttpClientError::Io(io_error) => match io_error.kind() {
50+
io::ErrorKind::InvalidData => BlockSourceError::persistent(e),
51+
io::ErrorKind::InvalidInput => BlockSourceError::persistent(e),
52+
_ => BlockSourceError::transient(e),
53+
},
54+
}
55+
}
56+
}
57+
58+
/// Conversion from `RpcClientError` into `BlockSourceError`.
59+
#[cfg(feature = "rpc-client")]
60+
impl From<RpcClientError> for BlockSourceError {
61+
fn from(e: RpcClientError) -> BlockSourceError {
62+
match &e {
63+
RpcClientError::Http(http_error) => match http_error {
64+
HttpClientError::Transport(_) => BlockSourceError::transient(e),
65+
// HTTP non-2xx errors are transient
66+
HttpClientError::Http(_) => BlockSourceError::transient(e),
67+
HttpClientError::Io(io_error) => match io_error.kind() {
68+
io::ErrorKind::InvalidData => BlockSourceError::persistent(e),
69+
io::ErrorKind::InvalidInput => BlockSourceError::persistent(e),
70+
_ => BlockSourceError::transient(e),
71+
},
72+
},
73+
// RPC errors are transient
74+
// e.g. "block not found" should not stop polling
75+
RpcClientError::Rpc(_) => BlockSourceError::transient(e),
76+
// Malformed response data is persistent
77+
RpcClientError::InvalidData(_) => BlockSourceError::persistent(e),
78+
}
79+
}
80+
}
81+
3882
/// Parses binary data as a block.
3983
impl TryInto<Block> for BinaryResponse {
4084
type Error = io::Error;

0 commit comments

Comments
 (0)