1use {crate::io, core::str::Utf8Error, thiserror::Error};
3
4#[derive(Error, Debug)]
5pub enum Error {
6 #[error(transparent)]
7 WriteError(#[from] WriteError),
8 #[error(transparent)]
9 ReadError(#[from] ReadError),
10}
11
12#[derive(Error, Debug)]
13pub enum WriteError {
14 #[error(transparent)]
15 Io(#[from] io::WriteError),
16 #[error(transparent)]
17 InvalidUtf8Encoding(#[from] Utf8Error),
18 #[error("Sequence length would overflow length encoding scheme: {0}")]
19 LengthEncodingOverflow(&'static str),
20 #[error("Custom error: {0}")]
21 Custom(&'static str),
22}
23
24#[derive(Error, Debug)]
25pub enum ReadError {
26 #[error(transparent)]
27 Io(#[from] io::ReadError),
28 #[error(transparent)]
29 InvalidUtf8Encoding(#[from] Utf8Error),
30 #[error("Could not cast integer type to pointer sized type")]
31 PointerSizedReadError,
32 #[error(
33 "Encoded sequence length exceeded preallocation limit of {limit} bytes (needed {needed} \
34 bytes)"
35 )]
36 PreallocationSizeLimit { needed: usize, limit: usize },
37 #[error("Invalid tag encoding: {0}")]
38 InvalidTagEncoding(usize),
39 #[error("Invalid bool encoding: {0}")]
40 InvalidBoolEncoding(u8),
41 #[error("Sequence length would overflow length encoding scheme: {0}")]
42 LengthEncodingOverflow(&'static str),
43 #[error("Invalid char lead: {0}")]
44 InvalidCharLead(u8),
45 #[error("Custom error: {0}")]
46 Custom(&'static str),
47 #[error("Zero-copy read would be unaligned")]
48 UnalignedPointerRead,
49}
50
51pub type Result<T> = core::result::Result<T, Error>;
52pub type WriteResult<T> = core::result::Result<T, WriteError>;
53pub type ReadResult<T> = core::result::Result<T, ReadError>;
54
55#[cold]
56pub const fn unaligned_pointer_read() -> ReadError {
57 ReadError::UnalignedPointerRead
58}
59
60#[cold]
61pub const fn preallocation_size_limit(needed: usize, limit: usize) -> ReadError {
62 ReadError::PreallocationSizeLimit { needed, limit }
63}
64
65#[cold]
66pub const fn read_length_encoding_overflow(max_length: &'static str) -> ReadError {
67 ReadError::LengthEncodingOverflow(max_length)
68}
69
70#[cold]
71pub const fn write_length_encoding_overflow(max_length: &'static str) -> WriteError {
72 WriteError::LengthEncodingOverflow(max_length)
73}
74
75#[cold]
76pub const fn pointer_sized_decode_error() -> ReadError {
77 ReadError::PointerSizedReadError
78}
79
80#[cold]
81pub const fn invalid_bool_encoding(byte: u8) -> ReadError {
82 ReadError::InvalidBoolEncoding(byte)
83}
84
85#[cold]
86pub const fn invalid_tag_encoding(tag: usize) -> ReadError {
87 ReadError::InvalidTagEncoding(tag)
88}
89
90#[cold]
91pub const fn invalid_utf8_encoding(error: Utf8Error) -> ReadError {
92 ReadError::InvalidUtf8Encoding(error)
93}
94
95#[cold]
96pub const fn invalid_char_lead(val: u8) -> ReadError {
97 ReadError::InvalidCharLead(val)
98}