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}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
85#[serde(rename_all = "camelCase")]
86pub enum StorageResultType {
87 Value(String),
89 Hash(String),
91 ClosestDescendantMerkleValue(String),
93}
94
95#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
97#[serde(rename_all = "camelCase")]
98pub struct StorageResultErr {
99 pub key: String,
101 #[serde(flatten)]
103 pub error: StorageResultType,
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
108#[serde(untagged)]
109pub enum ArchiveStorageResult {
110 Ok(ArchiveStorageMethodOk),
112 Err(ArchiveStorageMethodErr),
114}
115
116impl ArchiveStorageResult {
117 pub fn ok(result: Vec<StorageResult>, discarded_items: usize) -> Self {
119 Self::Ok(ArchiveStorageMethodOk { result, discarded_items })
120 }
121
122 pub fn err(error: String) -> Self {
124 Self::Err(ArchiveStorageMethodErr { error })
125 }
126}
127
128#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
130#[serde(rename_all = "camelCase")]
131pub struct ArchiveStorageMethodOk {
132 pub result: Vec<StorageResult>,
134 pub discarded_items: usize,
136}
137
138#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
140#[serde(rename_all = "camelCase")]
141pub struct ArchiveStorageMethodErr {
142 pub error: String,
144}
145
146#[cfg(test)]
147mod tests {
148 use super::*;
149
150 #[test]
151 fn storage_result() {
152 let item =
154 StorageResult { key: "0x1".into(), result: StorageResultType::Value("res".into()) };
155 let ser = serde_json::to_string(&item).unwrap();
157 let exp = r#"{"key":"0x1","value":"res"}"#;
158 assert_eq!(ser, exp);
159 let dec: StorageResult = serde_json::from_str(exp).unwrap();
161 assert_eq!(dec, item);
162
163 let item =
165 StorageResult { key: "0x1".into(), result: StorageResultType::Hash("res".into()) };
166 let ser = serde_json::to_string(&item).unwrap();
168 let exp = r#"{"key":"0x1","hash":"res"}"#;
169 assert_eq!(ser, exp);
170 let dec: StorageResult = serde_json::from_str(exp).unwrap();
172 assert_eq!(dec, item);
173
174 let item = StorageResult {
176 key: "0x1".into(),
177 result: StorageResultType::ClosestDescendantMerkleValue("res".into()),
178 };
179 let ser = serde_json::to_string(&item).unwrap();
181 let exp = r#"{"key":"0x1","closestDescendantMerkleValue":"res"}"#;
182 assert_eq!(ser, exp);
183 let dec: StorageResult = serde_json::from_str(exp).unwrap();
185 assert_eq!(dec, item);
186 }
187
188 #[test]
189 fn storage_query() {
190 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Value };
192 let ser = serde_json::to_string(&item).unwrap();
194 let exp = r#"{"key":"0x1","type":"value"}"#;
195 assert_eq!(ser, exp);
196 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
198 assert_eq!(dec, item);
199
200 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Hash };
202 let ser = serde_json::to_string(&item).unwrap();
204 let exp = r#"{"key":"0x1","type":"hash"}"#;
205 assert_eq!(ser, exp);
206 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
208 assert_eq!(dec, item);
209
210 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsValues };
212 let ser = serde_json::to_string(&item).unwrap();
214 let exp = r#"{"key":"0x1","type":"descendantsValues"}"#;
215 assert_eq!(ser, exp);
216 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
218 assert_eq!(dec, item);
219
220 let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsHashes };
222 let ser = serde_json::to_string(&item).unwrap();
224 let exp = r#"{"key":"0x1","type":"descendantsHashes"}"#;
225 assert_eq!(ser, exp);
226 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
228 assert_eq!(dec, item);
229
230 let item =
232 StorageQuery { key: "0x1", query_type: StorageQueryType::ClosestDescendantMerkleValue };
233 let ser = serde_json::to_string(&item).unwrap();
235 let exp = r#"{"key":"0x1","type":"closestDescendantMerkleValue"}"#;
236 assert_eq!(ser, exp);
237 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
239 assert_eq!(dec, item);
240 }
241
242 #[test]
243 fn storage_query_paginated() {
244 let item = PaginatedStorageQuery {
245 key: "0x1",
246 query_type: StorageQueryType::Value,
247 pagination_start_key: None,
248 };
249 let ser = serde_json::to_string(&item).unwrap();
251 let exp = r#"{"key":"0x1","type":"value"}"#;
252 assert_eq!(ser, exp);
253 let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap();
255 assert_eq!(dec.key, item.key);
256 assert_eq!(dec.query_type, item.query_type);
257 let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap();
258 assert_eq!(dec, item);
259
260 let item = PaginatedStorageQuery {
261 key: "0x1",
262 query_type: StorageQueryType::Value,
263 pagination_start_key: Some("0x2"),
264 };
265 let ser = serde_json::to_string(&item).unwrap();
267 let exp = r#"{"key":"0x1","type":"value","paginationStartKey":"0x2"}"#;
268 assert_eq!(ser, exp);
269 let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap();
271 assert_eq!(dec, item);
272 }
273}