libipld_cbor/
error.rs

1//! CBOR error types.
2use std::any::type_name;
3use thiserror::Error;
4
5/// Number larger than u64.
6#[derive(Debug, Error)]
7#[error("Number larger than {ty}.")]
8pub struct NumberOutOfRange {
9    /// Type.
10    pub ty: &'static str,
11}
12
13impl NumberOutOfRange {
14    /// Creates a new `NumberOutOfRange` error.
15    pub fn new<T>() -> Self {
16        Self {
17            ty: type_name::<T>(),
18        }
19    }
20}
21
22/// Number is not minimally encoded.
23#[derive(Debug, Error)]
24#[error("Number not minimally encoded.")]
25pub struct NumberNotMinimal;
26
27/// Length larger than usize or too small, for example zero length cid field.
28#[derive(Debug, Error)]
29#[error("Length out of range when decoding {ty}.")]
30pub struct LengthOutOfRange {
31    /// Type.
32    pub ty: &'static str,
33}
34
35impl LengthOutOfRange {
36    /// Creates a new `LengthOutOfRange` error.
37    pub fn new<T>() -> Self {
38        Self {
39            ty: type_name::<T>(),
40        }
41    }
42}
43
44/// Unexpected cbor code.
45#[derive(Debug, Error)]
46#[error("Unexpected cbor code `0x{code:x}` when decoding `{ty}`.")]
47pub struct UnexpectedCode {
48    /// Code.
49    pub code: u8,
50    /// Type.
51    pub ty: &'static str,
52}
53
54impl UnexpectedCode {
55    /// Creates a new `UnexpectedCode` error.
56    pub fn new<T>(code: u8) -> Self {
57        Self {
58            code,
59            ty: type_name::<T>(),
60        }
61    }
62}
63
64/// Unexpected key.
65#[derive(Debug, Error)]
66#[error("Unexpected key `{key}` when decoding `{ty}`.")]
67pub struct UnexpectedKey {
68    /// Key.
69    pub key: String,
70    /// Type.
71    pub ty: &'static str,
72}
73
74impl UnexpectedKey {
75    /// Creates a new `UnexpectedKey` error.
76    pub fn new<T>(key: String) -> Self {
77        Self {
78            key,
79            ty: type_name::<T>(),
80        }
81    }
82}
83
84/// Missing key.
85#[derive(Debug, Error)]
86#[error("Missing key `{key}` for decoding `{ty}`.")]
87pub struct MissingKey {
88    /// Key.
89    pub key: &'static str,
90    /// Type.
91    pub ty: &'static str,
92}
93
94impl MissingKey {
95    /// Creates a new `MissingKey` error.
96    pub fn new<T>(key: &'static str) -> Self {
97        Self {
98            key,
99            ty: type_name::<T>(),
100        }
101    }
102}
103
104/// Unknown cbor tag.
105#[derive(Debug, Error)]
106#[error("Unknown cbor tag `{0}`.")]
107pub struct UnknownTag(pub u64);
108
109/// Unexpected eof.
110#[derive(Debug, Error)]
111#[error("Unexpected end of file.")]
112pub struct UnexpectedEof;
113
114/// The byte before Cid was not multibase identity prefix.
115#[derive(Debug, Error)]
116#[error("Invalid Cid prefix: {0}")]
117pub struct InvalidCidPrefix(pub u8);
118
119/// A duplicate key within a map.
120#[derive(Debug, Error)]
121#[error("Duplicate map key.")]
122pub struct DuplicateKey;