rs_car_sync/
error.rs

1use std::io;
2
3use ipld_core::cid::{self, multihash, Cid};
4
5#[derive(Debug)]
6pub enum CarDecodeError {
7    InvalidCarV1Header(String),
8    InvalidCarV2Header(String),
9    InvalidMultihash(String),
10    InvalidCid(String),
11    InvalidBlockHeader(String),
12    BlockDigestMismatch(String),
13    UnsupportedHashCode((HashCode, Cid)),
14    BlockStartEOF,
15    UnsupportedCarVersion { version: u64 },
16    IoError(io::Error),
17}
18
19#[derive(Debug)]
20pub enum HashCode {
21    Code(u64),
22}
23
24impl std::fmt::Display for CarDecodeError {
25    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
26        write!(f, "{self:?}")
27    }
28}
29
30impl std::error::Error for CarDecodeError {
31    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
32        match self {
33            CarDecodeError::IoError(err) => Some(err),
34            _ => None,
35        }
36    }
37}
38
39impl From<io::Error> for CarDecodeError {
40    fn from(error: io::Error) -> Self {
41        CarDecodeError::IoError(error)
42    }
43}
44
45impl From<multihash::Error> for CarDecodeError {
46    fn from(error: multihash::Error) -> Self {
47        CarDecodeError::InvalidMultihash(format!("{:?}", error))
48    }
49}
50
51impl From<cid::Error> for CarDecodeError {
52    fn from(error: cid::Error) -> Self {
53        CarDecodeError::InvalidCid(format!("{:?}", error))
54    }
55}