ipld_nostd/multihash/
error.rs

1use {
2	crate::varint,
3	core2::{error::Error as StdError, io},
4	varint::decode,
5};
6
7/// Opaque error struct for operations involving a
8/// [`Multihash`](crate::Multihash).
9#[derive(Debug)]
10pub struct Error {
11	kind: Kind,
12}
13
14impl Error {
15	pub(crate) const fn invalid_size(size: u64) -> Self {
16		Self {
17			kind: Kind::InvalidSize(size),
18		}
19	}
20
21	pub(crate) const fn insufficient_varint_bytes() -> Self {
22		Self {
23			kind: Kind::Varint(decode::Error::Insufficient),
24		}
25	}
26
27	pub(crate) const fn varint_overflow() -> Self {
28		Self {
29			kind: Kind::Varint(decode::Error::Overflow),
30		}
31	}
32}
33
34impl core::fmt::Display for Error {
35	fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
36		self.kind.fmt(f)
37	}
38}
39
40#[derive(Debug)]
41enum Kind {
42	/// Io error.
43	Io(io::Error),
44	/// Invalid multihash size.
45	InvalidSize(u64),
46	/// Invalid varint.
47	Varint(decode::Error),
48}
49
50pub(crate) fn varint_decode_to_multihash_error(
51	err: varint::decode::Error,
52) -> Error {
53	Error {
54		kind: Kind::Varint(err),
55	}
56}
57
58pub(crate) fn io_to_multihash_error(err: io::Error) -> Error {
59	Error {
60		kind: Kind::Io(err),
61	}
62}
63
64impl core::fmt::Display for Kind {
65	fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
66		match self {
67			Self::Io(err) => write!(f, "{err}"),
68			Self::InvalidSize(size) => write!(f, "Invalid multihash size {size}."),
69			Self::Varint(err) => write!(f, "{err}"),
70		}
71	}
72}
73
74impl StdError for Error {
75	fn source(&self) -> Option<&(dyn StdError + 'static)> {
76		match &self.kind {
77			Kind::Io(inner) => Some(inner),
78			Kind::InvalidSize(_) => None,
79			Kind::Varint(_) => None, // FIXME: Does not implement `core2::Error`.
80		}
81	}
82}