1use std::{fs, io, result};
2
3use thiserror::Error;
4
5pub type Result<T, E = Error> = result::Result<T, E>;
6
7#[derive(Debug, Error)]
9pub enum Error {
10 #[error(transparent)]
11 IO(#[from] io::Error),
12
13 #[error("Database is locked by another process")]
14 TryLock(#[from] fs::TryLockError),
15
16 #[error("Region not found")]
18 RegionNotFound,
19
20 #[error("Region metadata has unwritten data")]
21 RegionMetadataUnwritten,
22
23 #[error("Region already exists")]
24 RegionAlreadyExists,
25
26 #[error("Cannot remove region: still held by {} reference(s)", ref_count - 1)]
27 RegionStillReferenced { ref_count: usize },
28
29 #[error("Write position {position} is beyond region length {region_len}")]
31 WriteOutOfBounds { position: usize, region_len: usize },
32
33 #[error("Cannot truncate to {from} bytes (current length: {current_len})")]
35 TruncateInvalid { from: usize, current_len: usize },
36
37 #[error("Invalid region ID")]
39 InvalidRegionId,
40
41 #[error("Invalid metadata size: expected {expected} bytes, got {actual}")]
42 InvalidMetadataSize { expected: usize, actual: usize },
43
44 #[error("Empty region metadata")]
45 EmptyMetadata,
46
47 #[error("Region index mismatch in layout")]
49 RegionIndexMismatch,
50
51 #[error("Hole too small: have {hole_size} bytes, need {requested}")]
52 HoleTooSmall { hole_size: usize, requested: usize },
53
54 #[error("Internal invariant violated: {0}")]
56 InvariantViolation(String),
57
58 #[error("Corrupted metadata: {0}")]
59 CorruptedMetadata(String),
60
61 #[error("Write retry limit exceeded after {retries} attempts")]
62 WriteRetryLimitExceeded { retries: usize },
63
64 #[error("Region size would overflow: current={current}, requested={requested}")]
65 RegionSizeOverflow { current: usize, requested: usize },
66
67 #[error("Overlapping copy ranges not supported (src={src}..{src_end}, dst={dst}..{dst_end})")]
68 OverlappingCopyRanges {
69 src: usize,
70 src_end: usize,
71 dst: usize,
72 dst_end: usize,
73 },
74
75 #[error("Failed to punch hole at offset {start} (length {len}): {source}")]
77 HolePunchFailed {
78 start: usize,
79 len: usize,
80 source: io::Error,
81 },
82
83 #[error("Hole punching is not supported on this platform")]
84 HolePunchUnsupported,
85}