wasm_dbms_api/memory/
error.rs1use std::array::TryFromSliceError;
2
3use serde::{Deserialize, Serialize};
4use thiserror::Error;
5
6use crate::memory::{Page, PageOffset};
7
8#[cfg_attr(feature = "candid", derive(candid::CandidType))]
10#[derive(Debug, Error, Deserialize, Serialize)]
11pub enum MemoryError {
12 #[error("ACL on-page layout version is not supported")]
15 AclLayoutUnsupported,
16 #[error("Autoincrement overflow: {0} column has reached its maximum value")]
18 AutoincrementOverflow(String),
19 #[error("Constraint violation: {0}")]
21 ConstraintViolation(String),
22 #[error("Data too large for page (page size: {page_size}, requested: {requested})")]
24 DataTooLarge { page_size: u64, requested: u64 },
25 #[error("Failed to decode data from bytes: {0}")]
27 DecodeError(DecodeError),
28 #[error("Failed to allocate a new page")]
30 FailedToAllocatePage,
31 #[error("Unclaimed pages ledger is full ({capacity} entries)")]
33 UnclaimedPagesFull {
34 capacity: u32,
36 },
37 #[error("Index not found for columns: {0:?}")]
39 IndexNotFound(Vec<String>),
40 #[error(
43 "Name hash collision: table `{candidate}` hashes to the same value as already-registered table `{existing}`"
44 )]
45 NameCollision {
46 candidate: String,
48 existing: String,
50 },
51 #[error("Entry not found in index")]
53 EntryNotFound,
54 #[error("Key too large: {size} bytes exceeds maximum {max} bytes")]
56 KeyTooLarge { size: u64, max: u64 },
57 #[error("Offset {offset} is not aligned to {alignment} bytes")]
58 OffsetNotAligned { offset: PageOffset, alignment: u16 },
59 #[error("Stable memory access out of bounds")]
61 OutOfBounds,
62 #[error(
64 "Tried to read or write out of the allocated page (page: {page}, offset: {offset}, data size: {data_size}, page size: {page_size})"
65 )]
66 SegmentationFault {
67 page: Page,
68 offset: PageOffset,
69 data_size: u64,
70 page_size: u64,
71 },
72 #[error("Memory provider error: {0}")]
74 ProviderError(String),
75}
76
77impl From<TryFromSliceError> for MemoryError {
78 fn from(err: TryFromSliceError) -> Self {
79 MemoryError::DecodeError(DecodeError::from(err))
80 }
81}
82
83impl From<std::string::FromUtf8Error> for MemoryError {
84 fn from(err: std::string::FromUtf8Error) -> Self {
85 MemoryError::DecodeError(DecodeError::from(err))
86 }
87}
88
89impl From<uuid::Error> for MemoryError {
90 fn from(err: uuid::Error) -> Self {
91 MemoryError::DecodeError(DecodeError::from(err))
92 }
93}
94
95#[cfg_attr(feature = "candid", derive(candid::CandidType))]
97#[derive(Debug, Error, Deserialize, Serialize)]
98pub enum DecodeError {
99 #[error("Bad raw record header")]
101 BadRawRecordHeader,
102 #[error("Invalid JSON: {0}")]
104 InvalidJson(String),
105 #[error("Identity decode error: {0}")]
107 IdentityDecodeError(String),
108 #[error("Failed to convert from slice: {0}")]
110 TryFromSliceError(String),
111 #[error("Failed to convert from UTF-8 string: {0}")]
113 Utf8Error(String),
114 #[error("Data too short to decode")]
116 TooShort,
117 #[error("Invalid discriminant: {0}")]
119 InvalidDiscriminant(u8),
120 #[error("UUID error: {0}")]
122 UuidError(String),
123}
124
125impl From<uuid::Error> for DecodeError {
126 fn from(err: uuid::Error) -> Self {
127 DecodeError::UuidError(err.to_string())
128 }
129}
130
131impl From<std::string::FromUtf8Error> for DecodeError {
132 fn from(err: std::string::FromUtf8Error) -> Self {
133 DecodeError::Utf8Error(err.to_string())
134 }
135}
136
137impl From<TryFromSliceError> for DecodeError {
138 fn from(err: TryFromSliceError) -> Self {
139 DecodeError::TryFromSliceError(err.to_string())
140 }
141}
142
143#[cfg(feature = "candid")]
144impl From<candid::types::principal::PrincipalError> for DecodeError {
145 fn from(err: candid::types::principal::PrincipalError) -> Self {
146 DecodeError::IdentityDecodeError(err.to_string())
147 }
148}
149
150#[cfg(test)]
151mod tests {
152
153 use super::*;
154
155 #[test]
156 fn test_memory_error_display() {
157 let error = MemoryError::DataTooLarge {
158 page_size: 1024,
159 requested: 2048,
160 };
161 assert_eq!(
162 format!("{}", error),
163 "Data too large for page (page size: 1024, requested: 2048)"
164 );
165 }
166
167 #[test]
168 fn test_decode_error_display() {
169 let error = DecodeError::BadRawRecordHeader;
170 assert_eq!(format!("{}", error), "Bad raw record header");
171 }
172}