1use std::io;
2
3use hdfs_types::common::RpcResponseHeaderProto;
4use hdfs_types::hdfs::BlockOpResponseProto;
5use prost::{DecodeError, EncodeError};
6
7mod fs;
8pub use fs::*;
9pub use hdfs_types as types;
10mod crc32;
11pub mod data_transfer;
12pub mod hrpc;
13
14#[derive(Debug, thiserror::Error)]
16pub enum HDFSError {
17 #[error("{0}")]
18 IOError(io::Error),
19 #[error("{0}")]
20 EncodeError(EncodeError),
21 #[error("{0}")]
22 DecodeError(DecodeError),
23 #[error("")]
24 ChecksumError,
25 #[error("")]
26 NoAvailableBlock,
27 #[error("")]
28 NoAvailableLocation,
29 #[error("")]
30 EmptyFS,
31 #[error("{0:?}")]
32 DataNodeError(Box<BlockOpResponseProto>),
33 #[error("{0:?}")]
34 NameNodeError(Box<RpcResponseHeaderProto>),
35}
36
37impl From<io::Error> for HDFSError {
38 fn from(value: io::Error) -> Self {
39 Self::IOError(value)
40 }
41}
42
43impl From<EncodeError> for HDFSError {
44 fn from(value: EncodeError) -> Self {
45 Self::EncodeError(value)
46 }
47}
48
49impl From<DecodeError> for HDFSError {
50 fn from(value: DecodeError) -> Self {
51 Self::DecodeError(value)
52 }
53}
54
55impl From<HDFSError> for io::Error {
56 fn from(value: HDFSError) -> Self {
57 match value {
58 HDFSError::IOError(e) => e,
59 HDFSError::EncodeError(e) => io::Error::new(io::ErrorKind::InvalidData, e),
60 HDFSError::DecodeError(e) => io::Error::new(io::ErrorKind::InvalidData, e),
61 HDFSError::ChecksumError => {
62 io::Error::new(io::ErrorKind::InvalidData, "mismatch checksum")
63 }
64 HDFSError::EmptyFS => {
65 io::Error::new(io::ErrorKind::InvalidData, "name node return empty fs")
66 }
67 HDFSError::NoAvailableBlock => {
68 io::Error::new(io::ErrorKind::UnexpectedEof, "no available block")
69 }
70 HDFSError::NoAvailableLocation => {
71 io::Error::new(io::ErrorKind::UnexpectedEof, "no available location")
72 }
73 HDFSError::NameNodeError(e) => io::Error::new(
74 io::ErrorKind::Other,
75 format!("name node error response {e:?}"),
76 ),
77 HDFSError::DataNodeError(e) => io::Error::new(
78 io::ErrorKind::Other,
79 format!("block operation response {e:?}"),
80 ),
81 }
82 }
83}