Skip to main content

rd_rds/
error.rs

1use thiserror::Error;
2
3use crate::SexpKind;
4
5/// Decode errors produced by `rd-rds`.
6///
7/// New failure categories may be added in minor releases; consumers should
8/// match this enum non-exhaustively with a wildcard arm.
9#[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("reference table limit ({limit}) exceeded at byte offset {offset}")]
43    ReferenceLimitExceeded { limit: usize, offset: usize },
44
45    #[error("unsupported SEXP kind {kind:?} with type code {type_code} at byte offset {offset}")]
46    UnsupportedSexp {
47        kind: SexpKind,
48        type_code: u8,
49        offset: usize,
50    },
51
52    #[error("recursion depth limit ({limit}) exceeded while decoding")]
53    DepthLimitExceeded { limit: u32 },
54
55    #[error("vector length {length} exceeds limit {limit} at byte offset {offset}")]
56    VectorLengthLimitExceeded {
57        limit: usize,
58        length: usize,
59        offset: usize,
60    },
61
62    #[error("decoded element total {total} exceeds limit {limit} at byte offset {offset}")]
63    TotalElementsLimitExceeded {
64        limit: usize,
65        total: usize,
66        offset: usize,
67    },
68
69    #[error("string bytes are not valid for the recorded encoding")]
70    InvalidStringEncoding,
71
72    #[error(
73        "PERSISTSXP payload declares an unsupported long-vector length ({len}) at byte offset {offset}"
74    )]
75    PersistedLongVectorUnsupported { len: u64, offset: usize },
76
77    #[error("vector declares an unsupported long-vector length ({len}) at byte offset {offset}")]
78    LongVectorUnsupported { len: u64, offset: usize },
79
80    #[error("negative vector length {len} at byte offset {offset}")]
81    NegativeLength { len: i32, offset: usize },
82
83    #[error("attribute pairlist tag is not a symbol at byte offset {offset}")]
84    InvalidAttributeTag { offset: usize },
85
86    #[error("SYMSXP print name is not a concrete text string")]
87    InvalidSymbolName,
88}