hdfs_client/
lib.rs

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/// hdfs error
15#[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}