1#[derive(Debug, thiserror::Error)]
3#[non_exhaustive]
4pub enum Error {
5 #[error("I/O error: {0}")]
7 Io(#[from] std::io::Error),
8
9 #[error("format error: {0}")]
11 Core(#[from] hurray_core::Error),
12
13 #[error("unexpected end of stream")]
15 UnexpectedEof,
16
17 #[error("invalid frame header: {0}")]
19 InvalidHeader(String),
20
21 #[error("buffer count mismatch: descriptor declares {declared}, got {actual}")]
23 MultiBufferLengthMismatch { declared: usize, actual: usize },
24
25 #[error("buffer[{index}] size mismatch: declared {declared}, got {actual}")]
27 BufferSizeMismatch {
28 index: usize,
29 declared: u64,
30 actual: u64,
31 },
32
33 #[error("frame too large: {kind} = {value}, limit = {limit}")]
35 FrameTooLarge {
36 kind: &'static str,
37 value: u64,
38 limit: u64,
39 },
40
41 #[error(
43 "buffer[{index}] sync_mode 0x{actual:02X} is invalid for cross-machine transport \
44 (must be 0x00 ProducerSynced)"
45 )]
46 InvalidCrossMachineSyncMode { index: usize, actual: u8 },
47
48 #[error(
51 "buffer[{index}]: {byte_size} bytes at alignment {alignment} is not an allocatable \
52 layout on this host"
53 )]
54 UnallocatableBuffer {
55 index: usize,
56 byte_size: u64,
57 alignment: u32,
58 },
59
60 #[error("torn composite: head declares {declared} member(s), stream ended after {actual}")]
63 TornComposite { declared: u32, actual: u32 },
64
65 #[error("composite nesting too deep: exceeded limit of {limit}")]
68 CompositeNestingTooDeep { limit: usize },
69
70 #[error("tensor {0:?} is not a composite head")]
72 NotAComposite(String),
73
74 #[error("stream core is unusable: {0}")]
78 CoreUnusable(crate::stream::Unusable),
79
80 #[error("stream core failed earlier and cannot continue")]
83 CoreFailed,
84
85 #[error("invalid progress report: {reported} byte(s) reported, {offered} offered")]
87 InvalidProgressReport { reported: usize, offered: usize },
88
89 #[error("zero-length write is not progress")]
91 ZeroLengthWrite,
92
93 #[error("sink closed mid-item: the item on the wire is truncated")]
96 SinkClosed,
97
98 #[error("the file header has not been written; drive FileWriterCore::header first")]
100 HeaderNotWritten,
101
102 #[error("invalid file magic: expected HRRYFILE")]
105 InvalidFileMagic,
106
107 #[error("invalid trailer magic")]
109 InvalidTrailerMagic,
110
111 #[error("unsupported container version {major}.x (reader supports 1.x)")]
113 UnsupportedContainerVersion { major: u8 },
114
115 #[error("tensor not found: {0:?}")]
117 TensorNotFound(String),
118
119 #[error("duplicate tensor name: {0:?}")]
121 DuplicateTensorName(String),
122
123 #[error("tensor name must not be empty")]
125 TensorNameEmpty,
126
127 #[error("tensor name too long: {len} bytes (max 65535)")]
129 TensorNameTooLong { len: usize },
130
131 #[error("index CRC-32C mismatch: stored 0x{stored:08X}, computed 0x{computed:08X}")]
133 IndexCrc32cMismatch { stored: u32, computed: u32 },
134
135 #[error("duplicate KV key: {0:?}")]
137 DuplicateKvKey(String),
138
139 #[error("KV key must not be empty")]
141 KvKeyEmpty,
142
143 #[error("KV key too long: {len} bytes (max 65535)")]
145 KvKeyTooLong { len: usize },
146
147 #[error("file header has reserved flag bits set: 0x{flags:08X}")]
149 ReservedFileFlagBits { flags: u32 },
150
151 #[error("index section overruns trailer boundary")]
153 IndexOverrunsTrailer,
154}
155
156pub type Result<T> = std::result::Result<T, Error>;