ic_query/icrc/model/
error.rs1#[cfg(feature = "host")]
8use crate::{HostCacheError, runtime::RuntimeError};
9use std::path::PathBuf;
10use thiserror::Error as ThisError;
11
12#[derive(Debug, ThisError)]
19pub enum IcrcError {
20 #[cfg(feature = "host")]
21 #[error("failed to create Tokio runtime for ICRC query: {0}")]
22 Runtime(#[from] RuntimeError),
23
24 #[error("failed to build IC agent for endpoint {endpoint}: {reason}")]
25 AgentBuild { endpoint: String, reason: String },
26
27 #[error("invalid {field}: {reason}")]
28 InvalidPrincipal { field: &'static str, reason: String },
29
30 #[error("invalid subaccount hex: {reason}")]
31 InvalidSubaccountHex { reason: String },
32
33 #[error("invalid subaccount length: expected 32 bytes, got {bytes}")]
34 InvalidSubaccountLength { bytes: usize },
35
36 #[error("failed to encode Candid request for {message}: {reason}")]
37 CandidEncode {
38 message: &'static str,
39 reason: String,
40 },
41
42 #[error("ICRC ledger method {method} failed: {reason}")]
43 AgentCall {
44 method: &'static str,
45 reason: String,
46 },
47
48 #[error("failed to decode Candid response {message}: {reason}")]
49 CandidDecode {
50 message: &'static str,
51 reason: String,
52 },
53}
54
55#[derive(Debug, ThisError)]
62pub enum IcrcAccountTransactionError {
63 #[error("invalid ICRC account transaction source endpoint {value:?}: {reason}")]
65 InvalidSourceEndpoint {
66 value: String,
68 reason: String,
70 },
71
72 #[error(
74 "invalid ICRC account transaction page size {page_size}; expected between 1 and {max_page_size}"
75 )]
76 InvalidPageSize {
77 page_size: u32,
79 max_page_size: u32,
81 },
82
83 #[error("invalid ICRC account transaction page: {reason}")]
85 InvalidPage {
86 reason: String,
88 },
89
90 #[error("invalid ICRC account transaction list limit {limit}; expected at least 1")]
92 InvalidListLimit {
93 limit: u32,
95 },
96
97 #[error("invalid ICRC account transaction max pages {max_pages}; expected at least 1")]
99 InvalidMaxPages {
100 max_pages: u32,
102 },
103
104 #[error("invalid ICRC account transaction cursor {value:?}: {reason}")]
106 InvalidCursor {
107 value: String,
109 reason: String,
111 },
112
113 #[error(transparent)]
115 Query(#[from] IcrcError),
116
117 #[error(
119 "failed to discover an index for ledger {ledger_canister_id}; supply an explicit index canister: {source}"
120 )]
121 IndexDiscovery {
122 ledger_canister_id: String,
124 #[source]
126 source: IcrcError,
127 },
128
129 #[error("ledger {ledger_canister_id} has no usable ICRC index: {reason}")]
131 IndexUnavailable {
132 ledger_canister_id: String,
134 reason: String,
136 },
137
138 #[error(
140 "ICRC index {index_canister_id} reports ledger {actual_ledger_canister_id}, expected {expected_ledger_canister_id}"
141 )]
142 IndexLedgerMismatch {
143 index_canister_id: String,
145 expected_ledger_canister_id: String,
147 actual_ledger_canister_id: String,
149 },
150
151 #[error("ICRC index {index_canister_id} account transaction query failed: {message}")]
153 IndexQuery {
154 index_canister_id: String,
156 message: String,
158 },
159
160 #[error(
162 "incomplete ICRC account transaction collection after {pages_fetched} page(s) and {rows_fetched} row(s): {reason}"
163 )]
164 IncompleteCollection {
165 index_canister_id: Option<String>,
167 pages_fetched: u32,
169 rows_fetched: usize,
171 last_cursor: Option<String>,
173 reason: String,
175 },
176
177 #[error(
179 "ICRC account transaction collection failed after {pages_fetched} page(s) and {rows_fetched} row(s): {source}"
180 )]
181 CollectionPage {
182 index_canister_id: Option<String>,
184 pages_fetched: u32,
186 rows_fetched: usize,
188 last_cursor: Option<String>,
190 #[source]
192 source: Box<Self>,
193 },
194
195 #[error(
197 "ICRC account transaction source returned index {actual_index_canister_id}, expected explicitly requested index {expected_index_canister_id}"
198 )]
199 CollectionIndexMismatch {
200 expected_index_canister_id: String,
202 actual_index_canister_id: String,
204 },
205
206 #[error("invalid ICRC account transaction cache at {}: {reason}", path.display())]
208 InvalidCache {
209 path: PathBuf,
211 reason: String,
213 },
214
215 #[error(
217 "invalid ICRC account transaction refresh attempt at {}: {reason}",
218 path.display()
219 )]
220 InvalidRefreshAttempt {
221 path: PathBuf,
223 reason: String,
225 },
226
227 #[cfg(feature = "host")]
229 #[error(transparent)]
230 Cache(#[from] HostCacheError),
231}