1use serde::{Deserialize, Serialize};
22
23#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[serde(rename_all = "camelCase")]
26pub struct StorageQuery<Key> {
27 pub key: Key,
29 #[serde(rename = "type")]
31 pub query_type: StorageQueryType,
32}
33
34#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
36#[serde(rename_all = "camelCase")]
37pub struct PaginatedStorageQuery<Key> {
38 pub key: Key,
40 #[serde(rename = "type")]
42 pub query_type: StorageQueryType,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 #[serde(default)]
46 pub pagination_start_key: Option<Key>,
47}
48
49#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub enum StorageQueryType {
53 Value,
55 Hash,
57 ClosestDescendantMerkleValue,
59 DescendantsValues,
61 DescendantsHashes,
63}
64
65impl StorageQueryType {
66 pub fn is_descendant_query(&self) -> bool {
68 matches!(self, Self::DescendantsValues | Self::DescendantsHashes)
69 }
70}
71
72#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct StorageResult {
76 pub key: String,
78 #[serde(flatten)]
80 pub result: StorageResultType,
81 #[serde(skip_serializing_if = "Option::is_none")]
83 #[serde(default)]
84 pub child_trie_key: Option<String>,
85}
86
87#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase")]
90pub enum StorageResultType {
91 Value(String),
93 Hash(String),
95 ClosestDescendantMerkleValue(String),
97}
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct StorageResultErr {
103 pub key: String,
105 #[serde(flatten)]
107 pub error: StorageResultType,
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
112#[serde(rename_all = "camelCase")]
113#[serde(tag = "event")]
114pub enum ArchiveStorageEvent {
115 Storage(StorageResult),
117 StorageError(ArchiveStorageMethodErr),
119 StorageDone,
121}
122
123impl ArchiveStorageEvent {
124 pub fn err(error: String) -> Self {
126 Self::StorageError(ArchiveStorageMethodErr { error })
127 }
128
129 pub fn result(result: StorageResult) -> Self {
131 Self::Storage(result)
132 }
133
134 pub fn is_done(&self) -> bool {
136 matches!(self, Self::StorageDone)
137 }
138
139 pub fn is_err(&self) -> bool {
141 matches!(self, Self::StorageError(_))
142 }
143
144 pub fn is_result(&self) -> bool {
146 matches!(self, Self::Storage(_))
147 }
148}
149
150#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase")]
153pub struct ArchiveStorageMethodOk {
154 pub result: Vec<StorageResult>,
156 pub discarded_items: usize,
158}
159
160#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
162#[serde(rename_all = "camelCase")]
163pub struct ArchiveStorageMethodErr {
164 pub error: String,
166}
167
168#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
170#[serde(rename_all = "camelCase")]
171pub enum ArchiveStorageDiffType {
172 Value,
174 Hash,
176}
177
178#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
180#[serde(rename_all = "camelCase")]
181pub struct ArchiveStorageDiffItem<Key> {
182 pub key: Key,
184 pub return_type: ArchiveStorageDiffType,
186 #[serde(skip_serializing_if = "Option::is_none")]
188 #[serde(default)]
189 pub child_trie_key: Option<Key>,
190}
191
192#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
194#[serde(rename_all = "camelCase")]
195pub struct ArchiveStorageDiffMethodResult {
196 pub result: Vec<ArchiveStorageDiffResult>,
198}
199
200#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase")]
203pub enum ArchiveStorageDiffOperationType {
204 Added,
206 Modified,
208 Deleted,
210}
211
212#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
214#[serde(rename_all = "camelCase")]
215pub struct ArchiveStorageDiffResult {
216 pub key: String,
218 #[serde(flatten)]
220 pub result: StorageResultType,
221 #[serde(rename = "type")]
223 pub operation_type: ArchiveStorageDiffOperationType,
224 #[serde(skip_serializing_if = "Option::is_none")]
226 #[serde(default)]
227 pub child_trie_key: Option<String>,
228}
229
230#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
237#[serde(rename_all = "camelCase")]
238#[serde(tag = "event")]
239pub enum ArchiveStorageDiffEvent {
240 StorageDiff(ArchiveStorageDiffResult),
242 StorageDiffError(ArchiveStorageMethodErr),
244 StorageDiffDone,
246}
247
248impl ArchiveStorageDiffEvent {
249 pub fn err(error: String) -> Self {
251 Self::StorageDiffError(ArchiveStorageMethodErr { error })
252 }
253
254 pub fn is_done(&self) -> bool {
256 matches!(self, Self::StorageDiffDone)
257 }
258
259 pub fn is_err(&self) -> bool {
261 matches!(self, Self::StorageDiffError(_))
262 }
263}
264
265#[cfg(test)]
266mod tests {
267 use super::*;
268
269 #[test]
270 fn archive_diff_input() {
271 let item = ArchiveStorageDiffItem {
273 key: "0x1",
274 return_type: ArchiveStorageDiffType::Value,
275 child_trie_key: None,
276 };
277 let ser = serde_json::to_string(&item).unwrap();
279 let exp = r#"{"key":"0x1","returnType":"value"}"#;
280 assert_eq!(ser, exp);
281 let dec: ArchiveStorageDiffItem<&str> = serde_json::from_str(exp).unwrap();
283 assert_eq!(dec, item);
284
285 let item = ArchiveStorageDiffItem {
287 key: "0x1",
288 return_type: ArchiveStorageDiffType::Hash,
289 child_trie_key: None,
290 };
291 let ser = serde_json::to_string(&item).unwrap();
293 let exp = r#"{"key":"0x1","returnType":"hash"}"#;
294 assert_eq!(ser, exp);
295 let dec: ArchiveStorageDiffItem<&str> = serde_json::from_str(exp).unwrap();
297 assert_eq!(dec, item);
298
299 let item = ArchiveStorageDiffItem {
301 key: "0x1",
302 return_type: ArchiveStorageDiffType::Value,
303 child_trie_key: Some("0x2"),
304 };
305 let ser = serde_json::to_string(&item).unwrap();
307 let exp = r#"{"key":"0x1","returnType":"value","childTrieKey":"0x2"}"#;
308 assert_eq!(ser, exp);
309 let dec: ArchiveStorageDiffItem<&str> = serde_json::from_str(exp).unwrap();
311 assert_eq!(dec, item);
312
313 let item = ArchiveStorageDiffItem {
315 key: "0x1",
316 return_type: ArchiveStorageDiffType::Hash,
317 child_trie_key: Some("0x2"),
318 };
319 let ser = serde_json::to_string(&item).unwrap();
321 let exp = r#"{"key":"0x1","returnType":"hash","childTrieKey":"0x2"}"#;
322 assert_eq!(ser, exp);
323 let dec: ArchiveStorageDiffItem<&str> = serde_json::from_str(exp).unwrap();
325 assert_eq!(dec, item);
326 }
327
328 #[test]
329 fn archive_diff_output() {
330 let item = ArchiveStorageDiffResult {
332 key: "0x1".into(),
333 result: StorageResultType::Value("res".into()),
334 operation_type: ArchiveStorageDiffOperationType::Added,
335 child_trie_key: None,
336 };
337 let ser = serde_json::to_string(&item).unwrap();
339 let exp = r#"{"key":"0x1","value":"res","type":"added"}"#;
340 assert_eq!(ser, exp);
341 let dec: ArchiveStorageDiffResult = serde_json::from_str(exp).unwrap();
343 assert_eq!(dec, item);
344
345 let item = ArchiveStorageDiffResult {
347 key: "0x1".into(),
348 result: StorageResultType::Hash("res".into()),
349 operation_type: ArchiveStorageDiffOperationType::Modified,
350 child_trie_key: None,
351 };
352 let ser = serde_json::to_string(&item).unwrap();
354 let exp = r#"{"key":"0x1","hash":"res","type":"modified"}"#;
355 assert_eq!(ser, exp);
356 let dec: ArchiveStorageDiffResult = serde_json::from_str(exp).unwrap();
358 assert_eq!(dec, item);
359
360 let item = ArchiveStorageDiffResult {
362 key: "0x1".into(),
363 result: StorageResultType::Hash("res".into()),
364 operation_type: ArchiveStorageDiffOperationType::Deleted,
365 child_trie_key: Some("0x2".into()),
366 };
367 let ser = serde_json::to_string(&item).unwrap();
369 let exp = r#"{"key":"0x1","hash":"res","type":"deleted","childTrieKey":"0x2"}"#;
370 assert_eq!(ser, exp);
371 let dec: ArchiveStorageDiffResult = serde_json::from_str(exp).unwrap();
373 assert_eq!(dec, item);
374 }
375
376 #[test]
377 fn storage_result() {
378 let item = StorageResult {
380 key: "0x1".into(),
381 result: StorageResultType::Value("res".into()),
382 child_trie_key: None,
383 };
384 let ser = serde_json::to_string(&item).unwrap();
386 let exp = r#"{"key":"0x1","value":"res"}"#;
387 assert_eq!(ser, exp);
388 let dec: StorageResult = serde_json::from_str(exp).unwrap();
390 assert_eq!(dec, item);
391
392 let item = StorageResult {
394 key: "0x1".into(),
395 result: StorageResultType::Hash("res".into()),
396 child_trie_key: None,
397 };
398 let ser = serde_json::to_string(&item).unwrap();
400 let exp = r#"{"key":"0x1","hash":"res"}"#;
401 assert_eq!(ser, exp);
402 let dec: StorageResult = serde_json::from_str(exp).unwrap();
404 assert_eq!(dec, item);
405
406 let item = StorageResult {
408 key: "0x1".into(),
409 result: StorageResultType::ClosestDescendantMerkleValue("res".into()),
410 child_trie_key: None,
411 };
412 let ser = serde_json::to_string(&item).unwrap();
414 let exp = r#"{"key":"0x1","closestDescendantMerkleValue":"res"}"#;
415 assert_eq!(ser, exp);
416 let dec: StorageResult = serde_json::from_str(exp).unwrap();
418 assert_eq!(dec, item);
419 }
420
421 #[test]
422 fn storage_query() {
423 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Value };
425 let ser = serde_json::to_string(&item).unwrap();
427 let exp = r#"{"key":"0x1","type":"value"}"#;
428 assert_eq!(ser, exp);
429 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
431 assert_eq!(dec, item);
432
433 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Hash };
435 let ser = serde_json::to_string(&item).unwrap();
437 let exp = r#"{"key":"0x1","type":"hash"}"#;
438 assert_eq!(ser, exp);
439 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
441 assert_eq!(dec, item);
442
443 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsValues };
445 let ser = serde_json::to_string(&item).unwrap();
447 let exp = r#"{"key":"0x1","type":"descendantsValues"}"#;
448 assert_eq!(ser, exp);
449 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
451 assert_eq!(dec, item);
452
453 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsHashes };
455 let ser = serde_json::to_string(&item).unwrap();
457 let exp = r#"{"key":"0x1","type":"descendantsHashes"}"#;
458 assert_eq!(ser, exp);
459 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
461 assert_eq!(dec, item);
462
463 let item =
465 StorageQuery { key: "0x1", query_type: StorageQueryType::ClosestDescendantMerkleValue };
466 let ser = serde_json::to_string(&item).unwrap();
468 let exp = r#"{"key":"0x1","type":"closestDescendantMerkleValue"}"#;
469 assert_eq!(ser, exp);
470 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
472 assert_eq!(dec, item);
473 }
474
475 #[test]
476 fn storage_query_paginated() {
477 let item = PaginatedStorageQuery {
478 key: "0x1",
479 query_type: StorageQueryType::Value,
480 pagination_start_key: None,
481 };
482 let ser = serde_json::to_string(&item).unwrap();
484 let exp = r#"{"key":"0x1","type":"value"}"#;
485 assert_eq!(ser, exp);
486 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
488 assert_eq!(dec.key, item.key);
489 assert_eq!(dec.query_type, item.query_type);
490 let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap();
491 assert_eq!(dec, item);
492
493 let item = PaginatedStorageQuery {
494 key: "0x1",
495 query_type: StorageQueryType::Value,
496 pagination_start_key: Some("0x2"),
497 };
498 let ser = serde_json::to_string(&item).unwrap();
500 let exp = r#"{"key":"0x1","type":"value","paginationStartKey":"0x2"}"#;
501 assert_eq!(ser, exp);
502 let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap();
504 assert_eq!(dec, item);
505 }
506}