1use thiserror::Error;
2
3use crate::SexpKind;
4
5#[derive(Debug, Error, PartialEq, Eq)]
10#[non_exhaustive]
11pub enum Error {
12 #[error(
13 "unexpected end of input at byte offset {offset} while reading {needed} bytes ({remaining} remaining)"
14 )]
15 UnexpectedEof {
16 offset: usize,
17 needed: usize,
18 remaining: usize,
19 },
20
21 #[error("unsupported RDS format marker bytes {marker:?} at byte offset {offset}")]
22 UnsupportedMarker { marker: [u8; 2], offset: usize },
23
24 #[error("unsupported RDS serialization format version {version} at byte offset {offset}")]
25 UnsupportedVersion { version: u32, offset: usize },
26
27 #[error("native encoding name is not valid UTF-8 at byte offset {offset}")]
28 InvalidUtf8 { offset: usize },
29
30 #[error("invalid SEXP type tag {tag:#x} at byte offset {offset}")]
31 InvalidSexpType { tag: u32, offset: usize },
32
33 #[error(
34 "REFSXP index {index} out of range (reference table has {len} entries) at byte offset {offset}"
35 )]
36 RefIndexOutOfRange {
37 index: u32,
38 len: usize,
39 offset: usize,
40 },
41
42 #[error("unsupported SEXP kind {kind:?} with type code {type_code} at byte offset {offset}")]
43 UnsupportedSexp {
44 kind: SexpKind,
45 type_code: u8,
46 offset: usize,
47 },
48
49 #[error("recursion depth limit ({limit}) exceeded while decoding")]
50 DepthLimitExceeded { limit: u32 },
51
52 #[error("vector length {length} exceeds limit {limit} at byte offset {offset}")]
53 VectorLengthLimitExceeded {
54 limit: usize,
55 length: usize,
56 offset: usize,
57 },
58
59 #[error("decoded element total {total} exceeds limit {limit} at byte offset {offset}")]
60 TotalElementsLimitExceeded {
61 limit: usize,
62 total: usize,
63 offset: usize,
64 },
65
66 #[error("string bytes are not valid for the recorded encoding")]
67 InvalidStringEncoding,
68
69 #[error(
70 "PERSISTSXP payload declares an unsupported long-vector length ({len}) at byte offset {offset}"
71 )]
72 PersistedLongVectorUnsupported { len: u64, offset: usize },
73
74 #[error("vector declares an unsupported long-vector length ({len}) at byte offset {offset}")]
75 LongVectorUnsupported { len: u64, offset: usize },
76
77 #[error("negative vector length {len} at byte offset {offset}")]
78 NegativeLength { len: i32, offset: usize },
79
80 #[error("attribute pairlist tag is not a symbol at byte offset {offset}")]
81 InvalidAttributeTag { offset: usize },
82
83 #[error("SYMSXP print name is not a concrete text string")]
84 InvalidSymbolName,
85}