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}