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("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}